static_assert зависит от нетипичного параметра шаблона (различное поведение в gcc и clang)
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