2010-10-14 24 views
5

Recientemente he comenzado a leer Modern C++ Design de Andrei Alexandrescu. Después de leer en tiempo de compilación aserciones, probé el siguiente código:CompileTimeChecker de Modern C++ Design no funciona como se esperaba

 
template<bool> struct CompileTimeChecker 
{ 
    CompileTimeChecker(...){}; 
}; 
template<> struct CompileTimeChecker<false>{}; 

#define STATIC_CHECK(expr, msg) \ 
{\ 
    class ERROR_##msg{}; \ 
    (void)sizeof(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ } 


int main() 
{ 
    STATIC_CHECK(sizeof(char)>sizeof(int),TypeTooNarrow); /*Line 2*/ 

    STATIC_CHECK(sizeof(char)<sizeof(int),TypeTooNarrow); /*Line 3*/ 
} 

El código no debería compilar debido a la línea 2, pero compila bien. Si cambio la línea 1 a

 
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ } 

o

 
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ } 

funciona como se esperaba. No lo entiendo

+0

Duplicado exacto (mismo usuario): [CompileTimeChecker del diseño moderno de C++ no funciona como se esperaba.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as -esperado) –

+0

Cierre el otro como duplicado. Deja que este sea abierto. –

+0

@Paul R: Creo que @Saurabh publicó la misma pregunta dos veces (por error, creo), la otra ya ha sido cerrada como duplicado de esta y ahora estás cerrando esto considerando esto como el engaño de otra. –

Respuesta

2
+0

@Nikolai: Eso funciona. En ese código, ¿cuál es la necesidad de (vacío) Error _ ## msg; –

+0

Esa segunda declaración está ahí, supongo, así que el compilador no se queja de la variable no utilizada. –

+0

Ok. ¿Y tienes algo sobre la pregunta que realmente hice? –

Cuestiones relacionadas