类本身的ADL

时间:2016-01-05 12:36:52

标签: c++ argument-dependent-lookup

如果我们将类类型作为函数参数,则根据标准参数相关的查找添加到搜索集类:

  

如果T是类类型(包括联合),则其关联的类是:类本身;它所属的成员,如果有的话;及其直接和间接基类。

如果是这样,为什么在此上下文中找不到foo

class X{
public:
void foo(const X& ref){std::cout<<"Inner class method\n";}
};

int main(){
X x;
foo(x);
}

不应该将adp添加到搜索集X类并在其中查找foo吗?

2 个答案:

答案 0 :(得分:4)

不,因为foo是一个成员函数,而不是可以通过ADL找到的自由函数。

也许你的意思是:

static void foo(const X& ref){std::cout<<"Inner class method\n";}

这也不会通过ADL找到;您需要像X::foo(b)一样限定通话。

关于关联类的子句用于在类中声明的友元函数。例如:

class X{
public:
    friend void foo(const X& ref){std::cout<<"Inner class method\n";}
};

foo是非成员函数,但只能通过ADL找到。

答案 1 :(得分:2)

foo不是免费功能,它是一种类方法,因此您需要从类的实例中调用它

X a;
X b;
a.foo(b);

请注意,这里使用的是ADL,因此您不必写出以下内容,这也可以正常编译,但由于ADL而导致不必要的详细信息

a.X::foo(b);