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

时间:2013-07-30 22:22:00

标签: 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似乎表明应该允许:

  

如果   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   声明的实体。

2 个答案:

答案 0 :(得分:12)

下一句话(在n3337中):

  

除了成员函数或静态数据成员的定义外,声明者ID不具备限定性   class,一个函数的定义或显式实例化或它之外的命名空间的变量成员   命名空间,或其命名空间之外的显式特化的定义,或者声明   friend函数,是另一个类或命名空间的成员。

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

答案 1 :(得分:4)

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