[英]Is “using namespace” transitive in C++?
令我惊讶的是,以下代码在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 ++中的错误,还是与语言规范一致?
我曾期望using namespace std
在封闭范围的末尾结束,而在命名空间A的定义末尾。
编辑:我了解该问题的公认答案也可以回答我的问题。 但是那篇文章更多地是关于匿名名称空间,而这篇文章是关于using namespace指令的可传递性。 因此,我认为这是一个更好的例子,这个问题很有意义。
是:
[C++14: 7.3.4/4]:
对于不合格的查找(3.4.1), using-directive是可传递的 :如果作用域包含一个using-directive来提名另一个本身包含using-directives的名称空间,则效果就像第二个名称空间的using指令也出现在第一个名称空间中一样。 [..]
因此,编译器是正确的。 在这里using namespace
将名称有效地导入到封闭的命名空间中:
[C++14: 7.3.4/2]:
using指令指定可以在使用指令出现在using指令之后的范围内使用指定命名空间中的名称。 [..]
这里的“范围”是名称空间的范围。 作用域的内容不会仅仅因为遇到}
而消失。 但是,有时对块作用域的熟悉会使人有这种感觉。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.