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
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) –
Cierre el otro como duplicado. Deja que este sea abierto. –
@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. –