繁体   English   中英

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

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

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

extern int i;
int ::i;

int main()
{
}

gcc抱怨说:

error: explicit qualification in declaration of `i`

这是不符合要求的行为吗? 标准中的哪个部分被视为格式错误?

8.3p1似乎表明应该允许:

如果限定符是global :: scope解析运算符,则declarator-id引用在全局命名空间作用域中声明的名称。

更新:

从N3485 8.3p1:

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

下一句话说(在n3337):

除了在其类之外的成员函数或静态数据成员的定义,在其命名空间之外的命名空间的函数或变量成员的定义或显式实例化,或者显式的定义之外, 声明者id不应被限定。在其命名空间之外的特化,或者是另一个类或命名空间的成员的友元函数的声明。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM