微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决未命名命名空间中“使用命名空间”的范围

为什么中的 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`
}

解决方法

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

namespace __compiler_generated_unique {

}
using namespace __compiler_generated_unique;

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


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

[namespace.unnamed]

1 一个未命名命名空间定义的行为就像它被替换了一样 通过

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

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

[namespace.udir]

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。