我最近开始阅读Andrei Alexandrescu的Modern C Design.阅读Compile-Time Assertions后,我尝试了以下代码:
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*/ }
由于第2行,代码不应该编译,但它编译得很好.如果我将第1行更改为
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ }
要么
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ }
它按预期工作.我不明白.
最佳答案 从
Loki library开始尝试
updated version.