CompileTimeChecker из Modern C ++ Design не работает должным образом - PullRequest
4 голосов
/ 14 октября 2010

Я недавно начал читать 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*/ }

работает как положено. Я не понимаю.

1 Ответ

2 голосов
/ 14 октября 2010

Попробуйте обновленную версию из библиотеки Loki .

...