当使用gcc 4.7编译以下C++11程序时:
extern int i;
int ::i;
int main()
{
}
gcc抱怨说:
error: explicit qualification in declaration of `i`
这是不符合规定的行为吗?在标准中,这个程序被认为是不正确的?
8.3p1似乎表明应允许这样做:
如果限定符是全局::作用域解析运算符,则声明符-id引用全局命名空间范围中声明的名称。
更新:
来自N3485 8.3p1:
声明者列表出现在可选的(第7条)decl-说明符-seq (7.1)之后。每个声明器都包含一个声明符-id;它指定声明的标识符。在声明器- id中出现的非限定-id应该是一个简单的标识符,但某些特殊函数的声明(12.3、12.4、13.5)和模板专门化或部分专门化的声明(14.7)除外。当声明符id被限定时,声明应引用限定符所引用的类或名称空间以前声明的成员(或者,如果是名称空间,则指该名称空间的内联命名空间集的元素(7.3.1))或其专门化;该成员不应仅仅是由声明器id的嵌套名称说明符指定的类或命名空间范围内的使用-声明引入的。合格声明者id的嵌套名称说明符不应以解密类型说明符开头.注意:如果限定符是全局::作用域解析操作符,则声明符-id引用全局命名空间范围中声明的名称。- end注意,声明符-id后面的可选属性-说明符-seq属于声明的实体。
发布于 2013-07-30 22:24:46
下一句是(在n3337中):
声明符-id不应是qualified,除非其类之外的成员函数或静态数据成员的definition、名称空间外的命名空间的函数或变量成员的definition或显式实例化、其命名空间外的显式专门化的definition或属于另一个类或命名空间的朋友函数的声明。
在异常中没有提到全局变量的定义。
发布于 2013-07-31 19:30:30
根据C++11的说法,GCC是对的。在C++14,这是允许的。请参阅defects.html#482
https://stackoverflow.com/questions/17958497
复制相似问题