2010-03-17 4 views
7

Bezug auf den gestrigen Post, das weckte mich heute Morgen auf. Warum funktioniert das eigentlich? Solange die Funktion test betroffen ist, hat diese Funktion keinen Körper, also wie kann sie etwas ausführen? Ich möchte wissen warum und wie das funktioniert? Ich bin wirklich interessiert Ihre Antworten zu sehen.Warum das funktioniert (Vorlagen, 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 }; 
}; 

Vielen Dank im Voraus mit Hilfe, um dieses sehr interessante Phänomen zu verstehen.

+0

Für die Standardese finden Sie unter '3.2/2' und '3.2/3' (beide auf Definition von "Verwendung" und die Folgen von„mit " etwas). –

Antwort

6

Ich nehme an, Sie beziehen sich auf die Yes enum? IsClassT<T>::test<T>(0)? sizeof bewertet seine Argumente nicht. Deshalb Code wie die folgenden legal ist, auch wenn Sie es auf Sie zu retten könnte erwarten:

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

Was mich wirklich interessiert ist, warum obwohl Test keinen Körper hat, bekomme ich keinen Fehler dafür? –

+7

Da der Rückgabetyp zum Zeitpunkt der Kompilierung ohne den Textkörper bekannt ist. Es ist einfach ein 'char' oder' char [2] '. Das ist alles, was der Compiler braucht, und es wird vom Standard sanktioniert. Um klar zu sein, gilt & ldquor; sizeof "für den Rückgabewert der Funktion (nicht z. B. die Code-Größe der Funktion) und um zu berechnen, dass Sie nur den Typ kennen müssen und kein tatsächliches Objekt dieses Typs haben müssen. – Ari

8
  1. Sie können keine Compiler-Fehler erhalten, weil test -function Erklärung existiert.

  2. Sie können keine Linker-Fehler erhalten, weil Sie nichttest -function rufen Sie.

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

5.3.3 Sizeof

sizeof Der Bediener die Anzahl der Bytes in der Objektdarstellung seines Operanden ergibt . Der Operand ist entweder ein Ausdruck , der nicht oder geklammerte Typ-ID ausgewertet wird. Der sizeof Betreiber müssen ...

...