Ответ 1
Цитаты, найденные @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
) является допустимым поведением компилятора. Отсутствие проблемы - правильное поведение компилятора. Поведение программы, составленной из плохо сформированной, не требующей диагностики программы, не определяется стандартом: это поведение undefined. Носовые демоны разрешены.
Необычные попытки (например, sizeof(int[answer])!=sizeof(int[answer])
могут понравиться текущему компилятору god, но не делают вашу программу более корректной.
Вы можете сделать случай, когда компилятор вряд ли сможет вас поймать, но некорректность остается вне зависимости от способности компилятора поймать вас с ней. Как правило, С++ хочет оставить (и его компиляторы) свободу найти недопустимый код шаблона "раньше, чем экземпляр"; это означает, что код шаблона должен содержать, возможно, юридический код.
Возможно, вы хотите что-то вроде =delete
с прикрепленным сообщением.