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

时间:2018-05-20 10:28:23

标签: c++ templates language-lawyer grammar declaration

GCCClang不同意template<typename>;是否是全局范围内C ++中的有效语句。

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

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

2 个答案:

答案 0 :(得分:14)

这是clang的特殊行为已经存在了很长时间:缺少声明只会产生警告。它与此相同:

int;

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

  

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

-Werror=missing-declarations直截了当。

答案 1 :(得分:13)

不是真的。该标准在[temp]p2;

中明确禁止此类声明
  

模板声明中的声明(如果有的话)

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

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

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

  •   
  • 演绎指南

  •   
  • alias-declaration

  •   

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

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