Цитаты, найденные @TartainLlama
Если гипотетическая реализация шаблона сразу после его определения будет неправильно сформирована из-за конструкции, которая не зависит от параметра шаблона, программа является неправильно сформированной; диагностика не требуется.
N4296 [temp.res]/8
Это применяется сразу после определения основного шаблона (тот, в котором есть static_assert
). Так что более позднюю специализацию (для 42
) рассматривать нельзя, так как ее еще нет.
Следующий вопрос: если static_assert( sizeof(answer) != sizeof(answer),
зависит от answer
. Семантически это не так, синтаксически это так и стандартно:
Внутри шаблона некоторые конструкции имеют семантику, которая может отличаться от одного экземпляра к другому. Такая конструкция зависит от параметров шаблона.
N4296 [temp.dep]/1
Конструкция sizeof(answer) != sizeof(answer)
не отличается от одного экземпляра к другому. Так что такая конструкция не зависит от параметров шаблона. Это означает, что все static_assert
не зависит от параметра шаблона.
Таким образом, ваша программа плохо сформирована, диагностика не требуется. Выдача произвольной диагностики (например, ошибка static_assert
) является допустимым поведением компилятора. Отсутствие проблемы является допустимым поведением компилятора. Поведение программы, скомпилированной из плохо сформированной, не требующей диагностики программы, не определяется стандартом: это неопределенное поведение. Носовые демоны разрешены.
Причудливые попытки (например, sizeof(int[answer])!=sizeof(int[answer])
могут понравиться текущему компилятору god, но не сделают вашу программу более правильной.
Вы можете привести случай, когда компилятор вряд ли сможет вас застать за этим, но неправильность формы останется независимо от способности компилятора застать вас за этим. Как правило, С++ хочет оставить себе (и его компиляторам) свободу находить недопустимый код шаблона «до создания экземпляра»; это означает, что код шаблона должен создавать, возможно, легальный код.
Возможно, вам нужно что-то вроде =delete
с прикрепленным сообщением.
person
Yakk - Adam Nevraumont
schedule
06.05.2015
static_assert
считается членом класса и должно возникать только при создании экземпляра класса. Кстати, можно было просто оставить первичный шаблон объявлением без определения. - person Lingxi   schedule 06.05.2015should come into being only when the class is instantiated
Я не думаю, что это правда: например.static_assert(sizeof(int) != sizeof(int), "some error");
будет генерировать ошибку, когда член шаблона, даже если шаблон никогда не создавался. - person bolov   schedule 06.05.2015static_assert
зависит от параметра шаблона. - person bolov   schedule 06.05.2015Hitchhiker
не создавался со случайными параметрами, вы можете просто объявить шаблон какtemplate <int> struct Hitchhiker;
. Таким образом, диагностика не настраивается, но она будет одинаково работать как на Clang, так и на gcc. - person Matthieu M.   schedule 06.05.2015