2008-10-06 2 views
22

기본적으로 C++에서는 단일 인수 생성자를 암시 적 변환 연산자로 사용할 수 있습니다. 이것은 생성자를 명시 적으로 표시하여 표시하지 않을 수 있습니다.C++에서 단일 인수 생성자를 명시 적으로 지정 하시겠습니까?

컴파일러가 자동으로 변환을 위해이 생성자를 사용할 수 없도록 "명시 적"을 기본값으로 만드는 것을 선호합니다.

표준 C++에서이를 수행 할 수있는 방법이 있습니까? 실패 할 경우,이를 수행하기 위해 Microsoft C++에서 작동하는 pragma (또는 유사)가 있습니까? g ++ (우리는 사용하지 않지만 유용한 정보 일 수 있습니다)는 어떻습니까?

답변

17

아니요, 모두 손으로해야합니다. 그것은 고통이지만, 당신은 분명히 단일 인자 생성자를 명시 적으로 만드는 습관에 빠져 있어야합니다. 솔루션을 찾은 다음 다른 플랫폼으로 코드를 이식해야만하는 고통을 상상할 수 없습니다. 코드를 덜 이식 할 수 있기 때문에 보통 이런 식의 컴파일러 확장 기능을 꺼려해야합니다.

+1

솔직히 말해서, 우리는 이식성에 대해 너무 신경 쓰지 않습니다; 우리는 창고 다. 그것은 우리가 상관하지 않는다는 것을 의미하는 것이 아닙니다. 즉, 일단 Win32 GUI 프레임 워크를 선택하면 Linux 또는 OSX를 지원하는 것이 학문적 인 것입니다. –

+1

이식성은 단순한 플랫폼 문제가 아닙니다. 윈도우 용으로 사용할 수있는 다른 컴파일러가 있습니다 (예 : 인텔, MinGW. 새로운 버전의 Microsoft 컴파일러에는 이전 버전과의 호환성도 있습니다. 당신이 가진 유일한 보장은 C++위원회가 기존의 C++ 코드를 깨기 전에 매우 신중하게 생각한다는 것입니다. –

+0

명확히하기 위해, 나는 Microsoft가 생각하지 않고 사람들의 코드를 깨뜨릴 것이라고 제안하지는 않지만 표준위원회의 것과는 다른 압력을 가지고 있습니다. –

0

나는 대답이 '아니오'라고 생각합니다!

죄송합니다. 매우 건설적인 답변이 아닙니다. 다른 사람이 더 많이 알기를 바랍니다.

0

표준 C++에서 사용할 수있는 옵션이 없기 때문에 Visual Studio에서도 이러한 옵션을 사용할 수 없습니다.

1

당신이 가지고있는 헤더에 대해 다소 불쾌 할 수 있습니다. <vector> 또는 부스트 헤더와 같습니다. 또한 꽤 잘못된 버그 보고서가 발생할 수도 있습니다. 따라서 컴파일러가 #pragma를 추가 할 것으로 기대하지 않습니다.

1

내가 알고있는 한 컴파일러에는 그러한 옵션이 없습니다. 그러나 그러한 경우에 대해 린트 (Lint) 경고가 있습니다 (http://www.gimpel.com/lintinfo.htm 참조).

1

기본적으로 생성자를 명시 적으로 만드는 pragma 또는 명령 줄 옵션이있는 경우 명시 적이 아닌 선언 방법은 무엇입니까? 암시 적 변환 생성자를 선언 할 수있게하려면 다른 컴파일러 관련 토큰 또는 pragma가 있어야합니다.

+1

나는 그것을 좋아한다. 그것은 Raymond Chen의 개혁적인 총 중 하나입니다. "내가 이걸 할 수 있을까? 그걸로 상상할 수 있니?" –

+1

나는 당신이 말하는 것을 얻는다. 명령 행 옵션을 사용하면 이것이 사실 일 것입니다. pragma를 사용하면 나중에 끌 수 있습니다. 또는 MSVC를 사용하면 현재 클래스 (c.f. __declspec (novtable))로 제한 될 수있는 __pragma 또는 __declspec 확장명을 사용할 수 있습니다. –

관련 문제