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

为什么 using 指令using namespace std;in当包含在匿名命名空间中时表现得好像它出现在全局范围内?

#include <iostream>

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

int main()
{
  cout << 1; // compiles fine if `namespace x` is replaced with `namespace`
}

回答

一个未命名的命名空间本质上相当于写:

namespace __compiler_generated_unique {

}
using namespace __compiler_generated_unique;

所以这就像在全局范围内使用 using 指令。using 指令是可传递的。


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

[命名空间.未命名]

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

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

当且仅当 inline 出现在 unnamed-namespace-definition 中并且unique翻译单元中所有出现的被替换为相同的标识符时,才会出现 inline ,并且该标识符与翻译单元中的所有其他标识符不同。未命名命名空间定义中的可选属性说明符序列属于unique

[命名空间.udir]

4对于非限定查找([basic.lookup.unqual]),using-directive 是可传递的:如果一个作用域包含一个 using-directive,它指定了一个包含 using-directives 的第二个命名空间,效果就像 using-directives从第二个命名空间也出现在第一个。


以上是未命名命名空间中“使用命名空间”的范围的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>