提问者:小点点

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


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

共1个答案

匿名用户

未命名的命名空间相当于实质上写:

namespace __compiler_generated_unique {

}
using namespace __compiler_generated_unique;

这就像在全局范围内有一个using指令。和使用指令是可传递的。

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

[命名空间.未命名]

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

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

内联出现的条件是且仅当它出现在unnamed-namespace-definition中,并且转换单元中unique的所有出现都被相同的标识符替换,并且该标识符与转换单元中的所有其他标识符不同。unnamed-namespace-definition中的可选属性-specifier-seq属于unique

[namespace.udir]

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