惊讶地发现下面的代码可以在VC++ 2017上编译并输出“X”:
#include <string>
#include <iostream>
namespace A {
using namespace std;
}
namespace B {
using namespace A;
}
namespace C {
using namespace B;
string a;
}
int main()
{
C::a = "X";
std::cout << C::a;
return 0;
}
看起来 using namespace std
从命名空间 A 经过命名空间 B 进入命名空间 C。
这是 Visual C++ 的一个 bug 吗?还是符合语言规范?
我原本以为 using namespace std
在封闭作用域结束时结束,而该作用域在命名空间 A 的定义结尾处结束。
编辑:我理解 this question 的被接受答案也回答了我的问题。但那篇文章更多地涉及匿名命名空间,而这篇文章则涉及 using 命名空间指令的传递性。所以我认为这是一个更好的例子,这个问题是有意义的。
using namespace
将所有名称导入主机命名空间,之后它们并不会消失。 - Quentin