2010-03-17 7 views
7

어제의 게시물을 참조하면 이 아침에 나를 깨웠다. 왜 실제로 작동합니까? 함수 test에 관한 한,이 함수는 몸체가 없으므로 어떻게 수행 할 수 있습니까? 왜 그리고 어떻게 작동하는지 알고 싶습니다. 나는 정말로 당신의 답을보고 싶습니다.이것이 작동하는 이유 (템플릿, SFINAE). C++

template<typename T> 
class IsClassT { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE 
    template<typename C> static Two test(…); //NOR HERE 
    public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

이 매우 흥미로운 현상을 이해하는 데 도움을 주셔서 감사합니다.

+0

는'3.2/2' 및 참조'3.2/3' (사용 "의"사용 "의 정의와 결과에 두 "뭔가). –

답변

6

예 열거 형을 추천한다고 가정합니다. IsClassT<T>::test<T>(0)? sizeof는 실제로 인수를 평가하지 않습니다. 다음과 같은 코드가 법적 이유는 당신이 당신을 구제 기대 할지라도,이다 : test α- 함수 선언가 존재하기 때문에

int* p = 0; 
int sizeof_int = sizeof(*p); //oops, p is 0 :(
+0

내가 정말로 관심을 가지는 이유는 테스트에 시체가 없다고해도 이것에 대해 아무런 오류가 없다는 것입니다. –

+7

반환 유형은 컴파일 타임에 본문이 없으므로 알려져 있습니다. 그것은 단지'char' 또는'char [2]'입니다. 이것이 컴파일러가 필요로하는 모든 것이며 표준에 의해 허가됩니다. 명확하게 말하면,'sizeof'는 함수의 반환 값 (함수의 코드 크기가 아닌)에 적용되며, 타입을 알 필요가 있고 그 타입의 실제 객체는 필요가 없다는 것을 계산할 필요가 있습니다. – Ari

8
  1. 당신은 컴파일러 오류를 얻을 수 없습니다.

  2. test -function이 아니므로 링커 오류가 발생하지 않습니다.

C++하기 Standart ISO/IEC 14882 : 2003 (E)

5.3.3 SIZEOF sizeof의 연산자를 피연산자의 객체 표현의 바이트 수를 산출

. 피연산자가 인 이 아닌 것으로 계산됩니다. 또는 괄호로 묶인 type-id입니다. sizeof의 조작하여야한다하지 ...

... Standardese 들어

관련 문제