私は最近、Andrei Alexandrescu による Modern C++ Design を読み始めました。コンパイル時のアサーションを読んだ後、次のコードを試しました。
template<bool> struct CompileTimeChecker { CompileTimeChecker(...){}; }; template<> struct CompileTimeChecker<false>{}; #define STATIC_CHECK(expr, msg) \ {\ クラス ERROR_##msg{}; \ (void)sizeof(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*ライン1*/ } int main() { STATIC_CHECK(sizeof(char)>sizeof(int),TypeTooNarrow); /*2行目*/ STATIC_CHECK(sizeof(char)<sizeof(int),TypeTooNarrow); /*3行目*/ }
2 行目のため、コードはコンパイルされないはずですが、正常にコンパイルされます。Line 1を次のように変更すると
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*ライン1*/ }
また
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* ライン1*/ }
期待どおりに動作します。理解できません。