2010-10-14 3 views
5

Ich habe vor kurzem angefangen zu lesen Modern C++ Design von Andrei Alexandrescu. Compile-Time Assertions Nach der Lektüre habe ich versucht, den folgenden Code:CompileTimeChecker von Modern C++ Design funktioniert nicht wie erwartet

 
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*/ 
} 

Der Code sollte 2 aufgrund Linie nicht kompilieren, aber es kompiliert in Ordnung. Wenn ich die Zeile 1 bis

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

oder

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

funktioniert ändern, wie erwartet. Ich verstehe es nicht.

+0

Exaktes Duplikat (gleicher Benutzer): [CompileTimeChecker von Modern C++ Design funktioniert nicht wie erwartet.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as -expected) –

+0

Schließen Sie den anderen als Duplikat. Lass diesen offen sein. –

+0

@Paul R: Ich denke, dass @Saurabh die gleiche Frage zweimal gepostet hat (irrtümlich denke ich), die andere wurde bereits als Duplikat geschlossen und jetzt schließt du das, indem du diese als die Betrogene der anderen betrachtest. –

Antwort

2

Versuchen Sie updated version aus der,.

+0

@Nikolai: Das funktioniert. In diesem Code, was ist die Notwendigkeit für (void) Fehler _ ## msg; –

+0

Diese zweite Aussage ist da, denke ich, also beschwert sich der Compiler nicht über ungenutzte Variable. –

+0

Ok. Und hast du etwas zu der Frage, die ich eigentlich gestellt habe? –