1

遇到的时候

x op y

ADL 是否找到成员 x.op(y)?或者指定的查找好像不是 x.op(y),然后是 ADL(op, x, y)?

4

1 回答 1

4

考虑成员候选人、非成员候选人(有 ADL)和内置候选人。最佳候选人被选中。

[over.match.oper]/3

对于具有operator @cv 非限定版本为 的类型的操作数的一元,以及具有 cv 非限定版本为的类型的左操作数和 cv 非限定版本为的类型的右操作数T1的二进制,三组候选函数、指定成员候选、非成员候选和内置候选的构造如下:operator @T1T2

  • 如果T1是一个完整的类类型,则该成员候选集是T1::operator@(13.3.1.1.1)的合格查找的结果;否则,候选成员集合为空。

  • 非成员候选集是根据非operator@限定函数调用 (3.4.2) 中名称查找的常用规则在表达式上下文中非限定查找的结果,除了忽略所有成员函数。但是,如果没有操作数具有类类型,则只有查找集中的那些非成员函数具有类型的第一个参数T1或“reference to (possibly cv-qualified) T1”,whenT1是枚举类型,或者(如果有右操作数)类型的第二个参数T2或“对(可能是 cv 限定的)的引用T2”,当T2是枚举类型时,是候选函数。

  • 对于operator ,、一元operator &operator ->,内置候选集为空。对于所有其他运算符,内置候选函数包括 13.6 中定义的所有候选运算符函数,与给定运算符相比,

    • 具有相同的操作员名称,并且
    • 接受相同数量的操作数,并且
    • 接受可以根据 13.3.3.1 将给定操作数转换为的操作数类型,以及
    • 没有与任何非模板非成员候选相同的参数类型列表。

[over.match.oper]/6

用于重载解决的候选函数集是成员候选、非成员候选和内置候选的并集。参数列表包含运算符的所有操作数。根据 13.3.2 和 13.3.3 从候选函数集中选择最佳函数。

于 2013-01-02T00:23:44.157 回答