首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++11 gcc:声明中的明确限定?标准裁判?

C++11 gcc:声明中的明确限定?标准裁判?
EN

Stack Overflow用户
提问于 2013-07-30 22:22:00
回答 2查看 2.1K关注 0票数 6

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

代码语言:javascript
运行
复制
extern int i;
int ::i;

int main()
{
}

gcc抱怨说:

代码语言:javascript
运行
复制
error: explicit qualification in declaration of `i`

这是不符合规定的行为吗?在标准中,这个程序被认为是不正确的?

8.3p1似乎表明应允许这样做:

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

更新:

来自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的嵌套名称说明符不应以解密类型说明符开头.注意:如果限定符是全局::作用域解析操作符,则声明符-id引用全局命名空间范围中声明的名称。- end注意,声明符-id后面的可选属性-说明符-seq属于声明的实体。

EN

回答 2

Stack Overflow用户

发布于 2013-07-30 22:24:46

下一句是(在n3337中):

声明符-id不应是qualified,除非其类之外的成员函数或静态数据成员的definition、名称空间外的命名空间的函数或变量成员的definition或显式实例化、其命名空间外的显式专门化的definition或属于另一个类或命名空间的朋友函数的声明。

在异常中没有提到全局变量的定义。

票数 12
EN

Stack Overflow用户

发布于 2013-07-31 19:30:30

根据C++11的说法,GCC是对的。在C++14,这是允许的。请参阅defects.html#482

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17958497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档