Является ли `template <typename>;` допустимым C ++? - PullRequest
0 голосов
/ 20 мая 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

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

объявление в шаблонном объявлении (если есть)) должен

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

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

  • определяют шаблон элемента класса или шаблона класса, либо

  • быть руководством по удержанию или

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

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

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

0 голосов
/ 20 мая 2018

Это своеобразное поведение clang, которое существует уже давно: пропущенные объявления генерируют только предупреждение.Это так же, как это:

int;

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

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

-Werror=missing-declarations все исправляет.

...