GCC和Clang不同意template<typename>;
是否是全局范围内C ++中的有效语句。
我希望在C ++标准中不允许它,因为模板化属于声明语句,而不是表达式语句,因此也不属于空语句(语句;
)。
那么,这是Clang中的一个错误吗?
答案 0 :(得分:14)
这是clang的特殊行为已经存在了很长时间:缺少声明只会产生警告。它与此相同:
int;
g ++会显示错误,而clang只会显示警告。这与标准不矛盾。
警告:声明不声明任何内容[-Wmissing-declarations]
-Werror=missing-declarations
直截了当。
答案 1 :(得分:13)
不是真的。该标准在[temp]p2;
中明确禁止此类声明模板声明中的声明(如果有的话)
声明或定义函数,类或变量,或
定义成员函数,成员类,成员枚举或类模板或嵌套在类模板中的类的静态数据成员,或
定义类或类模板的成员模板,或
是演绎指南或
是 alias-declaration 。
empty-declaration 与这些子句中的任何一个都不匹配。现在标准规定,需要一个实现来发出任何违反其规则的诊断消息,比如这个。请注意,它表示诊断,它不指定是发出警告还是错误(甚至是注释)。编译器可以提供扩展,使您编写的内容有效,因为它不会改变格式良好的程序的含义。
所以不,两者都是对的。但是,clang的行为是由于扩展,而不是标准规定的内容。