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

Ответы на вопрос(2)

Ваш ответ на вопрос