2010-03-17 12 views
7

refiriéndose a la publicación de ayer, esto me despertó esta mañana. ¿Por qué esto realmente funciona? Siempre que se trate de la función test, esta función no tiene cuerpo, ¿cómo puede realizar algo? Quiero saber por qué y cómo funciona esto? Estoy REALMENTE interesado en ver tus respuestas.Por qué esto funciona (Plantillas, 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 }; 
}; 

Gracias de antemano por ayudarme a entender este fenómeno tan interesante.

+0

Para el Standardese, ver '3.2/2' y '3.2/3' (tanto en la definición de "uso" y las consecuencias de "utilizar " alguna cosa). –

Respuesta

6

Supongo que usted se está refiriendo a Sí enum? IsClassT<T>::test<T>(0)? sizeof en realidad no evalúa sus argumentos. Es por eso que un código como el siguiente es legal, a pesar de que se podría esperar que para rescatar a usted en:

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

Lo que realmente me interesa es por qué, aunque la prueba no tiene cuerpo, no me da error. –

+7

Porque el tipo de devolución se conoce en tiempo de compilación sin el cuerpo. Es simplemente un 'char' o' char [2] '. Eso es todo lo que necesita el compilador, y está sancionado por el estándar. Para que quede claro, 'sizeof' se aplica al valor de retorno de la función (no, por ejemplo, el tamaño del código de la función), y para calcular que solo necesita saber el tipo, no tiene un objeto real de ese tipo. – Ari

8
  1. No se puede obtener error de compilación porque existe test -función declaración.

  2. No se puede obtener el error del enlazador porque no llama altest -función.

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

5.3.3 Sizeof

El operador sizeof se obtiene el número de bytes en la representación objeto de su operando . El operando es una expresión, que no se evalúa, o type-id entre paréntesis. El operador sizeof no deberán ...

...

Cuestiones relacionadas