私は最近、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*/ }
期待どおりに動作します。理解できません。