Я недавно начал читать Modern C ++ Design Андрея Александреску. После прочтения утверждений времени компиляции я попробовал следующий код:
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*/ }
работает как положено. Я не понимаю.