5

私は最近、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*/ }

期待どおりに動作します。理解できません。

4

2 に答える 2

2

Loki ライブラリから更新されたバージョンを試してください。

于 2010-10-14T15:52:11.783 に答える