【发布时间】:2018-03-16 05:11:24
【问题描述】:
下面是代码示例:
#include<iostream>
using namespace std;
namespace B
{
int ohoh=2;
}
namespace A
{
int ohoh=666;
namespace C
{
//using B::ohoh;(as if declared by using directive) //why does the lookup not stops here?
int foo()
{
using namespace B;
cout<<ohoh<<endl;
}
}
}
int main()
{
A::C::foo();
}
输出是 666 但不是 2。为什么?
引自cppref
对于非限定名称,即没有出现在范围解析运算符 :: 右侧的名称,名称查找会按如下所述检查范围,直到找到至少一个任何类型的声明,此时查找停止并且不再检查范围。(注意:从某些上下文中查找会跳过某些声明,例如,查找 :: 左侧使用的名称会忽略函数、变量和枚举器声明, 查找用作基类说明符的名称会忽略所有非类型声明)
出于非限定名称查找的目的,由 using 指令指定的命名空间中的所有声明似乎都在最近的封闭命名空间中声明,该命名空间直接或间接包含 using 指令和指定的命名空间。
从上面引用的段落中,名称查找应该停止在最近的namespace C,我在代码中注释的地方。为什么它没有停止并找到A::ohoh?
顺便说一句,我觉得应该尽量少用using指令。
【问题讨论】:
标签: c++ using-directives name-lookup