Есть ли шаблон? <typename> ;" юридический C++?

GCC и Clang не согласны с тем, является ли template<typename>; является допустимым утверждением в C++ в глобальном масштабе.

Я ожидал, что это не будет разрешено в стандарте C++, потому что templatization относится к заявлениям декларации, а не к операторам выражений и, следовательно, также к недействительным операторам (утверждение ;).

Итак, это ошибка в Clang?

Ответ 1

На самом деле, нет. Стандарт явно запрещает такое объявление в [temp] p2;

Декларация в декларации шаблона (если таковая имеется)

  • объявить или определить функцию, класс или переменную, или

  • определить функцию-член, класс-член, перечисление элемента или статический элемент данных шаблона класса или класса, вложенного в шаблон класса, или

  • определить шаблон-член шаблона класса или класса или

  • быть руководством по вычету или

  • быть объявлением псевдонимов.

Пустое объявление не соответствует ни одному из этих предложений. Теперь в стандарте говорится, что для выдачи диагностического сообщения требуется выполнение для любого нарушения его правил, как этот. Обратите внимание, что он говорит о диагностике, он не указывает, выдается ли предупреждение или ошибка (или даже заметка). Компилятор может предоставить расширения, которые делают то, что вы написали, так как это не изменит смысл хорошо сформированной программы.

Так что нет, оба правы. Тем не менее, поведение clang связано с расширением, а не с тем, что указывает стандарт.

Ответ 2

Это типичное идиосинкратическое поведение, которое существовало в течение длительного времени: пропущенные декларации генерируют только предупреждение. Это так же, как это:

int;

g++ будет показывать ошибку, в то время как clang будет показывать только предупреждение. Это не противоречит стандарту.

предупреждение: декларация ничего не объявляет [-Wmissing-declarations]

-Werror=missing-declarations вещи прямо.