template <int answer> struct Hitchhiker {
static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};
template <> struct Hitchhiker<42> {};
で一般的なテンプレートのインスタンス化を無効にしようとしているときに、テンプレートがインスタンス化されていない場合でも上記のコードがアサート エラーを生成することをstatic_assert
発見しました。clang
gcc
Hitchhiker
42
いじってみると、次のように主張していることがわかりました。
template <int answer> struct Hitchhiker {
static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer");
};
template <> struct Hitchhiker<42> {};
両方のコンパイラで同じように動作します。アサートは、一般的なテンプレートがインスタンス化された場合にのみ開始されます。
標準は何と言っていますか、どのコンパイラが正しいですか?
g++ 4.9.2
clang++ 3.50