Stroustrup写道:
考虑二元运算符@。如果x是X类型而y是Y类型,x @ y就像这样解析:
•如果X是一个类,则查找operator @作为X的成员或作为X的基数的成员;和
•在x @ y周围的上下文中查找operator @的声明;和
•如果在名称空间N中定义X,则在N中查找operator @的声明;和
•如果Y在名称空间M中定义,请在M中查找operator @的声明。
可以找到多个运算符@s的声明,并使用重载决策规则(第12.3节)来查找最佳匹配(如果有)。仅当运算符具有至少一个用户定义类型的操作数时,才应用此查找机制。因此,将考虑用户定义的转换(第18.3.2节,第18.4节)。 请注意,类型别名只是一个同义词,而不是单独的用户定义类型(第6.5节)。 一元运算符的解析类似。
请注意,在操作员查找中,不会优先考虑非成员的成员。这与查找命名函数
不同那么大胆的表达意味着什么。如果类有成员并且同时存在可以在上下文中使用的非成员函数,那么没有给成员优先权?例如
class A
{
public:
bool operator==(const A&)
{
return true;
}
};
bool operator==(const A&, const A&)
{
return true;
}
int main()
{
A a, b;
a == b;
}
我认为(和编译器同意我:))应该调用成员函数,但如上所述,不应该优先考虑成员运算符。那句话究竟是什么意味着Stroustrup?