6

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

extern int i;
int ::i;

int main()
{
}

gcc 抱怨说:

error: explicit qualification in declaration of `i`

这是不合格的行为吗?该程序在标准中的哪些地方被认为格式不正确?

8.3p1 似乎表明应该允许:

如果限定符是全局 :: 范围解析运算符,则 declarator-id 指的是在全局命名空间范围内声明的名称。

更新:

从 N3485 8.3p1:

声明符列表出现在可选(第 7 条)decl-specifier-seq (7.1) 之后。每个声明符只包含一个声明符id;它命名声明的标识符。除某些特殊函数的声明(12.3、12.4、13.5)和模板特化或部分特化的声明(14.7)外,在 declarator-id 中出现的 unqualified-id 应该是一个简单的标识符。当 declarator-id 被限定时,声明应引用限定符所指的类或命名空间的先前声明的成员(或者,在命名空间的情况下,该命名空间的内联命名空间集合的元素(7.3 .1)) 或其专业化;该成员不应仅由声明符 id 的嵌套名称说明符指定的类或命名空间范围内的 using 声明引入。限定的 declarator-id 的 nested-name-specifier 不应以 decltype-specifier 开头。[ 注意:如果限定符是全局 :: 范围解析运算符,则 declarator-id 指的是在全局命名空间范围内声明的名称。— 尾注] 声明符 id 后面的可选属性说明符序列属于声明的实体。

4

2 回答 2

12

下一句说(在 n3337 中):

除了定义其类之外的成员函数或静态数据成员,定义或显式实例化其名称空间之外的名称空间的函数或变量成员,或显式定义其命名空间之外的特化,或作为另一个类或命名空间成员的友元函数的声明。

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

于 2013-07-30T22:24:46.410 回答
4

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

于 2013-07-31T19:30:30.823 回答