#c #language-lawyer #uninitialized-constant
#c #язык-юрист #неинициализированный-константа
Вопрос:
Следующая программа:
template<typename = void>
const int n;
успешно скомпилирован gcc, но clang выдает ошибку:
# error: default initialization of an object of const type 'const int'
const int n;
^
= 0
что имеет смысл.
gcc выдает ошибку, если n
используется, но требуется ли диагностика, даже если n
она не используется?
Ответ №1:
требуется ли диагностика, даже если
n
она не используется?
Нет. Применимым правилом является [temp.res.general]/8:
Допустимость шаблона может быть проверена перед любым созданием экземпляра.
Программа неправильно сформирована, диагностика не требуется, если:
- для шаблона или подстановки оператора constexpr if в шаблоне не может быть создана действительная специализация, и шаблон не создан, или
- …
- гипотетическое создание экземпляра шаблона сразу после его определения будет некорректно сформировано из-за конструкции, которая не зависит от параметра шаблона, или
- …
Таким образом, оба компилятора соответствуют Стандарту.