是`template <typename>;`legal C++?

Fyt*_*tch 16 c++ grammar templates declaration language-lawyer

GCCClangtemplate<typename>;在全球范围内是否是C++中的有效声明存在分歧.

我希望在C++标准中不允许它,因为模板化属于声明语句,而不是表达式语句,因此也不属于null语句(语句;).

那么,这是Clang中的一个错误吗?

Swi*_*Pie 14

这是clang的特殊行为已经存在了很长时间:缺少声明只会产生警告.它跟这个一样:

int;
Run Code Online (Sandbox Code Playgroud)

g ++会显示错误,而clang只会显示警告.这与标准不矛盾.

警告:声明不声明任何内容[-Wmissing-declarations]

-Werror=missing-declarations 把事情做好.


Rak*_*111 13

并不是的.该标准在[temp] p2中明确禁止这样的声明;

声明模板声明(如有)

  • 声明或定义函数,类或变量,或

  • 定义成员函数,成员类,成员枚举或类模板或嵌套在类模板中的类的静态数据成员,或者

  • 定义类或类模板的成员模板,或

  • 是一个演绎指南,或

  • 是一个别名声明.

空声明与这些子句中的任何一个都不匹配.现在标准规定,需要一个实现来发出任何违反其规则的诊断消息,比如这个.请注意,它表示诊断,它不指定是发出警告还是错误(甚至是注释).编译器可以提供扩展,使您编写的内容有效,因为它不会改变格式良好的程序的含义.

所以不,两者都是对的.但是,clang的行为是由于扩展,而不是标准指定的内容.