使用gcc 4.7编译以下C ++ 11程序时:
extern int i;
int ::i;
int main()
{
}
gcc抱怨说:
error: explicit qualification in declaration of `i`
这是不符合的行为吗?标准中的哪个部分被认为是不合格的?
8.3p1似乎表明应该允许:
如果 qualifier是global :: scope解析运算符,declarator-id指的是在global中声明的名称 命名空间范围。
更新
来自N3485 8.3p1:
声明符列表出现在可选(第7节)decl-specifier-seq(7.1)之后。每个声明者都包含 正好一个声明者身份;它命名声明的标识符。声明者中发生的不合格身份证明─ id应该是一个简单的标识符,除了一些特殊函数(12.3,12.4,13.5)的声明和 模板专业化或部分专业化的声明(14.7)。当declarator-id合格时, 声明应引用先前声明的限定符所在的类或命名空间的成员 引用(或者,在命名空间的情况下,引用该命名空间的内联命名空间集合的元素(7.3.1)) 或专业化;该成员不仅仅是通过使用声明引入的 在由declarator-id的nested-name-specifier指定的类或命名空间的范围内。该 限定的声明符id的nested-name-specifier不应以decltype-specifier开头。 [注意:如果 qualifier是global :: scope解析运算符,declarator-id指的是在global中声明的名称 名称范围。 - 结束注释]声明符-id附后的可选属性说明符-seq 声明的实体。
答案 0 :(得分:12)
下一句话(在n3337中):
除了成员函数或静态数据成员的定义外,声明者ID不具备限定性 class,一个函数的定义或显式实例化或它之外的命名空间的变量成员 命名空间,或其命名空间之外的显式特化的定义,或者声明 friend函数,是另一个类或命名空间的成员。
在例外中没有提到全局变量的定义。
答案 1 :(得分:4)