首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非限定名查找查找内联命名空间成员

非限定名查找查找内联命名空间成员
EN

Stack Overflow用户
提问于 2014-06-15 09:36:01
回答 1查看 160关注 0票数 6

我编写了以下代码:

代码语言:javascript
复制
   #include <iostream>

    inline namespace M
    {
        int j=42;
    }

    int main(){ std::cout << j << "\n"; } //j is unqualified name here. 
                 //Hence, unqualified name lookup rules will be applied.
                 //This implies that member of inline namespace shall not be considered. 
                 //But it is not true

而且效果很好。但我认为这个计划是错误的。这是因为标准说(N3797,sec )。7.3.1/7):

最后,通过显式限定 (3.4.3.2)在封闭名称空间中查找名称,将包含使用指令引入的内联名称空间的成员,即使在封闭名称空间中有该名称的声明。

此外,第3.4.1/6节没有提到在非限定名称查找中涉及内联名称空间的任何内容:

在函数声明器之后的函数定义中使用的名称-id 28是命名空间N的成员(其中,仅为公开目的,N可以表示全局范围)应在其在所使用的块中或在其一个封闭块(6.3)中使用之前声明,或在其在名称空间N中使用之前声明,如果N是嵌套的名称空间,则应在N的一个封闭命名空间中使用它之前声明其名称空间。

这是一个g++错误,还是我不正确地理解规则?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-15 12:05:54

没有虫子..。

不,它不是g++ (或clang++)中的一个bug,它具有所描述的行为,编译器应该找到j

代码语言:javascript
复制
inline namespace N {
  int j;
}

int main () {
  int a = j; // legal, `j` == `N::j`
}

标准怎么说?

您缺少了标准的一个非常重要的部分,即7.3.1§8,其中声明内联名称空间的封闭名称空间隐式地有一个使用指令,该指令引用内联命名空间。

[7.3.1]p8 命名空间定义 [namespace.def] 内联命名空间的成员可以在大多数方面使用,因为他们认为自己是封闭名称空间的成员。具体来说,内联名称空间及其包围的命名空间都会添加到参数依赖查找(3.4.2)中使用的一组关联名称空间中,并且a (7.3.4)将内联名称空间的名称隐式插入到封闭名称空间中,作为未命名的名称空间(7.3.1.1)。

精化

这意味着前面的示例在语义上等同于以下内容,其中我们引入了一个使用指令,将嵌套命名空间中的名称带入全局命名空间:

代码语言:javascript
复制
inline namespace N {
  int j;
}

using namespace N; // the implicit using-directive    

int main () {
  int a = j; // legal
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24228299

复制
相关文章

相似问题

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