C++中using namespace是否具有传递性?VC++2017编译问题咨询
嵌套命名空间中using namespace指令的作用域解析
嘿,这个问题挺有意思的!先给你吃个定心丸:这不是Visual C++ 2017的bug,它完全符合C++语言规范哦。
你原本以为using namespace std;的作用域会在命名空间A的定义结束时终止,这个理解确实存在偏差。根据C++标准的规定:
using namespace指令的作用域是它所在的声明区域,以及该区域内的所有嵌套声明区域。
换句话说,当你在命名空间A的顶层写下using namespace std;时,它的影响范围不仅覆盖A本身,还会自动延伸到A内部嵌套的所有子命名空间——也就是你代码里的B和C。所以在C的函数里直接使用cout(属于std命名空间的成员)是完全合法的,编译器能正确找到这个符号,自然会输出"X"。
如果想避免这种“作用域传递”的情况,你可以把using namespace std;放在更局部的作用域里,比如某个函数内部:
namespace A { namespace B { namespace C { void test() { using namespace std; cout << "X"; // 仅在此函数内生效 } } } }
这样它的影响范围就只会限制在那个函数里,不会扩散到外层或其他子命名空间啦。
内容的提问来源于stack exchange,提问作者Kit Fisto
相关产品推荐
相关产品推荐

