遇到的时候
x op y
ADL 是否找到成员 x.op(y)?或者指定的查找好像不是 x.op(y),然后是 ADL(op, x, y)?
考虑成员候选人、非成员候选人(有 ADL)和内置候选人。最佳候选人被选中。
[over.match.oper]/3
对于具有
operator @
cv 非限定版本为 的类型的操作数的一元,以及具有 cv 非限定版本为的类型的左操作数和 cv 非限定版本为的类型的右操作数T1
的二进制,三组候选函数、指定成员候选、非成员候选和内置候选的构造如下:operator @
T1
T2
如果
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 从候选函数集中选择最佳函数。