C++ C++;11通用条款:声明中的明确限定?标准参考号?

C++ C++;11通用条款:声明中的明确限定?标准参考号?,c++,gcc,c++11,C++,Gcc,C++11,使用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引用在全局 命名空间范围 更新: 从N3485 8.3p1开始: 在可选(第7条)decl说明符se

使用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引用在全局 命名空间范围

更新:

从N3485 8.3p1开始:

在可选(第7条)decl说明符seq(7.1)之后出现声明符列表。每个声明器包含 只有一个声明器id;它命名所声明的标识符。声明程序中出现的非限定id- id应为简单标识符,但某些特殊功能(12.3、12.4、13.5)的声明和 模板专门化或部分专门化的声明(14.7)。当声明器id被限定时, 该声明应引用该限定符所指向的类或命名空间的先前声明的成员 引用(或者,对于命名空间,引用该命名空间(7.3.1)的内联命名空间集的元素) 或其专门化;该成员不应仅通过使用声明介绍 在由declarator-id的嵌套名称说明符指定的类或命名空间的范围内 限定声明符id的嵌套名称说明符不得以decltype说明符开头。[注:如果 限定符是global::scope解析运算符,声明器id引用在全局 名称空间范围.-end note]声明器id后面的可选属性说明符seq与 声明的实体


下一句话是(在n3337中):

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


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

根据C++11,GCC是正确的。在C++14中,这是允许的。请参见

您使用的文档版本?我在看N3485@user1131467n3337。我也会查n3690,请稍等。n3690中的文本与您的问题中的文本相同。我发现在n3337中不太清楚。这句话:当声明器id被限定时,该声明应该引用该限定符所引用的类或名称空间的先前声明的成员,该类或名称空间对于“名称空间”所指的内容有点模糊。我认为它不包括全局名称空间,因为标准行话通常将其称为“全局范围”。因此,我认为规则没有改变。无论如何,n3337中的文本与官方标准最为接近——可以肯定地说,目前所讨论的代码是非法的。:)不,它确实适用于全局名称空间的成员,有一个注释明确说明了这一点:如果限定符是global::scope resolution运算符,声明器id是指在全局命名空间范围中声明的名称。奇怪的是,482是在2004年提出的,直到11月12日才出现。奇怪的是,这在最新版本的clang和gcc中仍然是不可能的