为什么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指令。和使用指令是可传递的。
作为规范参考,这里是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-指令也出现在第一个命名空间中。