未命名空间中“使用命名空间”的范围

Scope of `using namespace` in Unnamed Namespace

提问人:zdf 提问时间:3/9/2021 最后编辑:StoryTeller - Unslander Monicazdf 更新时间:3/9/2021 访问量:207

问:

为什么 using 指令包含在匿名命名空间中时,其行为就好像它出现在全局范围内一样?using namespace std;

#include <iostream>

namespace x
{
  using namespace std;
  void g()
  {
    cout << 1;
  }
}

int main()
{
  cout << 1; // compiles fine if `namespace x` is replaced with `namespace`
}
C++ 命名空间 using 指令

评论


答:

5赞 StoryTeller - Unslander Monica 3/9/2021 #1

一个未命名的命名空间实质上等同于编写:

namespace __compiler_generated_unique {

}
using namespace __compiler_generated_unique;

因此,这就像在全局范围内使用指令一样。使用指令是可传递的。


作为规范参考,这里来自 n4861(C++20 标准草案):

[命名空间.未命名]

1 未命名的命名空间定义的行为就像被替换了一样 由

inline namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

其中 inline 出现当且仅当它出现在 unnamed-namespace-definition 和 翻译单元被替换为相同的标识符,并且这 标识符与翻译单元中的所有其他标识符不同。 可选的 attribute-specifier-seq 中的 unnamed-namespace-definition 适用于 。uniqueunique

[命名空间.udir]

4 对于非限定查找 ([basic.lookup.unqual]),using 指令是可传递的:如果作用域包含一个 using 指令,该 using 指令指定第二个命名空间,而该命名空间本身包含 using 指令,则效果就好像第二个命名空间中的 using 指令也出现在第一个命名空间中一样。