2010-10-14 11 views
5

Ho recentemente iniziato a leggere Modern C++ Design di Andrei Alexandrescu. Dopo aver letto in fase di compilazione asserzioni, ho provato il seguente codice:CompileTimeChecker da Modern C++ Design non funziona come previsto

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

Il codice non dovrebbe compilare a causa di linea 2, ma compila bene. Se cambio la Linea 1 al

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

o

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

funziona come previsto. Non capisco

+0

duplicato esatto (stesso utente): [CompileTimeChecker da Design C++ moderno non funziona come previsto.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as -atteso) –

+0

Chiudere l'altro come duplicato. Lascia che questo sia aperto. –

+0

@Paul R: Penso che @Saurabh abbia postato la stessa domanda due volte (per errore credo), l'altro è già stato chiuso come duplicato per questo e ora lo stai chiudendo considerando questo come il dupe dell'altro. –

risposta

2
+0

@Nikolai: Funziona. In quel codice, a cosa serve (void) Error _ ## msg; –

+0

Questa seconda affermazione è lì, sto indovinando, quindi il compilatore non si lamenta della variabile inutilizzata. –

+0

Ok. E hai qualcosa sulla domanda che ho effettivamente chiesto? –

Problemi correlati