遇到
时x op y
ADL是否找到成员x.op(y)?或者查找指定为不是x.op(y),然后是ADL(op,x,y)?
答案 0 :(得分:4)
考虑会员候选人,非会员候选人(有ADL)和内置候选人。挑选最佳候选人。
[over.match.oper] / 3
对于具有cv非限定版本为
operator @
的类型的操作数的一元T1
,以及具有cv-nonqualified版本的类型的左操作数的二进制operator @
是T1
和cv非限定版本为T2
的类型的右操作数,三组候选函数,指定成员候选者,非成员候选者和内置候选者,构造如下:
如果
T1
是完整的类类型,则成员候选集合是T1::operator@
(13.3.1.1.1)的限定查找的结果;否则,成员候选人是空的。非成员候选者集合是根据非限定函数调用(3.4.2)中通常的名称查找规则在表达式上下文中对
operator@
进行非限定查找的结果,除非所有成员函数都被忽略。但是,如果没有操作数具有类类型,则只有查找集中具有类型T1
或“引用(可能是cv-qualified)T1
”的第一个参数的非成员函数,T1
是枚举类型,或者(如果有右操作数)第二个参数类型T2
或“引用(可能是cv限定的)T2
”,当{{1是一个枚举类型,是候选函数。对于
T2
,一元operator ,
或operator &
,内置候选集为空。对于所有其他运算符,内置候选包括13.6中定义的所有候选运算符函数,与给定运算符相比,
- 具有相同的运营商名称,
- 接受相同数量的操作数,
- 接受根据13.3.3.1可以转换给定操作数或操作数的操作数类型,并且
- 与任何非模板非成员候选人没有相同的参数类型列表。
[over.match.oper] / 6
重载决策的候选函数集是成员候选者,非成员候选者和内置候选者的联合。参数列表包含运算符的所有操作数。根据13.3.2和13.3.3选择候选函数集中的最佳函数。