Pregunta

refiriéndose a la entrada de ayer, esto me despertó esta mañana. ¿Por qué esto realmente funciona? Mientras que respecta a la test función, esta función no tiene cuerpo de modo cómo puede realizar cualquier cosa? Quiero saber por qué y cómo funciona esto? Estoy muy interesado en ver sus respuestas.

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 con la ayuda de entender este fenómeno muy interesante.

¿Fue útil?

Solución

Asumo que usted se refiere a la enumeración Sí? 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 :(

Otros consejos

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

  2. No se puede obtener error de vinculador porque no llame test-función.

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

  

5.3.3 Sizeof

     

El operador sizeof produce el número de bytes en el   representación de objeto de su operando.   El operando es o bien una expresión,   que no se evalúa , o una   paréntesis tipo-id. La talla de   operador no debe ...

     

...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top