{
무엇을 간접 변환이라고 하는가?
하나의 타입이 개발자가 눈치 못채게 다른 타입으로 변환 되는 것을 뜻하거나, 타입 변환이 정의하지 않아도 되는 것, 또는 변환 연산자 정의로 인하여, 변환되는 것을 뜻한다.(operator char*() 같은 것)
이것을 왜 피해야 하는가?
이것은 생성자의 호출이 예측하기 어렵게 만들고, 함수의 호출 역시 예측하기 어렵게 만들기 때문이다.
음~ 예를 들어 달라.
Display(5) 에서 무엇이 호출 될까? MSVC2005, 2008 에선 void Display( double ) 호출 되어 졌다.
만약 void Display( double ) 가 없다면 무엇이 호출 될까?
Widget( unsigned int ) 호출되어 Widget 이 생성 되고
void Display( const Widget& ) 이 호출 되어 진다.
참 아리송한 호출 형태인데, 이 것을 막기 위해선 Widget의 생성자에 explicit 키워드를 넣어 줌으로써 막아 줄 수 있다 주의, MSVC 2005 2008 에선 explicit 키워드가 잘 먹히지만, 다른 컴파일러는 모르겠다.
변환 연산자도 정리해야 되나, 알고 있는 사항이므로, 그냥 패스. ;;
요약.
1. 변환 연산자를 정의하지 말고, 명시적 변환을 사용 할 것, as_char 같은 것들
2. 단일 매개변수를 갖는 생성자의 경우 explicit 키워들 사용 할 것
부수적인 이야기
MSVC 라면, /WX, /RTCc 등의 컴파일 옵션을 통해서 상당히 높은 수준의 방어를 할 수 있다. 이 이야기는 최초 KGC2008 에서 강연을 통해서 알게 되었고, 파리체 책에서 자세히 볼수 있었으며, MSDN 에 자세히 설명 되어 있음을 여기에 기록한다.
최근댓글