【Exceptional C++(17)】名称搜索
2018-01-30 本文已影响2人
downdemo
问题
- 下面代码调用的是哪个函数
namespace A {
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B {
void f(int i) {
f(i); // 1
}
void g(A::X x) {
g(x); // 2
}
void h(A::Y y) {
h(y); // 3
}
}
解答
- 1调用的是它自己,并且是无穷递归,因为B没有using namespace A或using A::f,如果写了,将在A::f(int)和B::f(int)间造成二义性
- 2调用则会造成二义性,Koenig Lookup(简化版)规定如果给函数提供一个class类型实参,在名称搜索时编译器将认为包含实参类型的命名空间中的同名函数为可选函数
- 3调用的是它自己,也是无穷递归,因为没有其他的h(A::Y)函数