template <int answer> struct Hitchhiker {
static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};
template <> struct Hitchhiker<42> {};
При попытке отключить общий экземпляр шаблона с помощью static_assert
я обнаружил, что приведенный выше код в clang
генерирует ошибку assert даже тогда, когда шаблон не создается, а gcc
генерирует ошибку assert только при создании экземпляра Hitchhiker
с параметром, отличным от 42
.
Вокруг я обнаружил, что это утверждают:
template <int answer> struct Hitchhiker {
static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer");
};
template <> struct Hitchhiker<42> {};
ведет себя одинаково в обоих компиляторах: assert kicks только в том случае, когда создается общий шаблон.
Что говорит стандарт, какой компилятор прав?
g++ 4.9.2
clang++ 3.50