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

What are the exact name lookup rules for x op y?

本文关键字:查找 规则 是什么      更新时间:2023-10-16

遇到

x op y

ADL找到x.op(y)成员吗?还是将查找指定为if不是x.p (y),而是ADL(op, x, y)?

考虑成员候选、非成员候选(带ADL)和内置候选。最好的候选人被选中了。

[over.match.oper]/3

对于操作数为不限定版本T1的一元型operator @和左操作数为不限定版本T1、右操作数为不限定版本T2的二元型operator @,指定候选成员、非成员和内置候选函数三组候选函数的构造方法如下:

  • 如果T1是一个完整的类类型,则候选成员集合是T1::operator@(13.3.1.1.1)的限定查找的结果;

  • 非成员候选者集合是根据非限定函数调用(3.4.2)中名称查找的通常规则在表达式上下文中对operator@进行非限定查找的结果,只是所有成员函数都被忽略。但是,如果没有操作数具有类类型,则只有查找集中第一个形参类型为T1或"引用(可能限定)T1"(当T1是枚举类型时),或者(如果有右操作数)第二个形参类型为T2或"引用(可能限定)T2"(当T2是枚举类型时)的非成员函数才是候选函数。

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

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

[over.match.oper]/6

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