繁体   English   中英

在C ++中,“使用命名空间”是否可传递?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM