Инициализация по умолчанию неиспользуемого шаблона постоянной переменной

#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 в шаблоне не может быть создана действительная специализация, и шаблон не создан, или
  • гипотетическое создание экземпляра шаблона сразу после его определения будет некорректно сформировано из-за конструкции, которая не зависит от параметра шаблона, или

Таким образом, оба компилятора соответствуют Стандарту.