C++11 gcc:声明中的显式限定?标准参考号

C++11 gcc: explicit qualification in declaration? Standard ref?

本文关键字:标准 参考 gcc 声明 C++11      更新时间:2023-10-16

使用gcc 4.7编译以下C++11程序时:

extern int i;
int ::i;
int main()
{
}

gcc抱怨:

error: explicit qualification in declaration of `i`

这是不合规行为吗?该程序在标准中的哪些地方被视为格式错误?

8.3p1似乎表明应该允许:

如果限定符是global::scope解析运算符,声明符id引用在global中声明的名称命名空间范围。

更新:

自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的嵌套名称说明符不应以decltype说明符开头。[注意:如果限定符是global::scope解析运算符,声明符id引用在global中声明的名称命名空间范围。--end note]声明符id后面的可选特性说明符seq适用于声明的实体。

下一句话说(在n3337中):

声明者id不应被限定为,除非定义其外部的成员函数或静态数据成员类,定义或显式实例化一个函数或命名空间外的变量成员命名空间,或在其命名空间之外定义显式专门化,或声明friend函数,它是另一个类或命名空间的成员。

全局变量的定义在例外情况中没有提及。

GCC根据C++11是正确的。在C++14中,这是允许的。看见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#482