x op y的确切名称查找规则是什么?

时间:2013-01-02 00:14:43

标签: c++ c++11

遇到

x op y

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

1 个答案:

答案 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选择候选函数集中的最佳函数。