big*_*iao 0 c++ using-directives name-lookup
这是代码示例:
#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();
}
Run Code Online (Sandbox Code Playgroud)
输出是666但不是2.为什么?
引自cppref
对于非限定名称,即名称不在范围解析运算符::右侧的名称,名称查找检查范围如下所述,直到它找到任何类型的至少一个声明,此时查找停止并且不会审查其他范围. (注意:从某些上下文中查找会跳过一些声明,例如,查找用于左侧的名称:忽略函数,变量和枚举器声明,查找用作基类说明符的名称会忽略所有非类型声明)
出于非限定名称查找的目的,using命令指定的命名空间中的所有声明都显示为在最近的封闭命名空间中声明,该命名空间直接或间接包含using-directive和指定命名空间.
从上面引用的段落中,名称查找应该停在最近的位置namespace C,我在代码中注释了.为什么它不会停止并找到A::ohoh?
顺便说一句,我认为我应该尽可能少地使用using指令.
出于非限定名称查找的目的,来自由using指令指定的命名空间的所有声明,如同在包含using-directive和指定命名空间的最近的封闭命名空间中声明的那样.
在这种情况下,包含both B和using子指令的最近的命名空间是全局命名空间.因此,所有名称都B显示在内部A::C::foo,就像它们在全局命名空间中声明一样.搜索名称时ohoh,A会在全局命名空间之前搜索,因此A::ohoh找到第一个声明,并且名称查找在那里停止.
| 归档时间: |
|
| 查看次数: |
38 次 |
| 最近记录: |