J'ai récemment commencé à lire la conception moderne C++ par Andrei Alexandrescu. Après avoir lu la compilation Assertions, j'ai essayé le code suivant:CompileTimeChecker de la conception C++ moderne ne fonctionne pas comme prévu
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*/ }
Le code ne doit pas compiler en raison de la ligne 2, mais il compile bien. Si je change la ligne 1 à
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ }
ou
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ }
fonctionne comme prévu. Je ne comprends pas.
Exact duplicate (même utilisateur): [CompileTimeChecker de la conception C++ moderne ne fonctionne pas comme prévu.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as -expected) –
Fermez l'autre comme doublon. Laissez celui-ci être ouvert. –
@Paul R: Je pense que @Saurabh posté la même question deux fois (par erreur je pense), l'autre a déjà été fermé en tant que doublon à celui-ci et maintenant vous fermez ceci en considérant celui-ci comme la dupe de l'autre. –