【发布时间】:2015-06-30 18:39:03
【问题描述】:
Stroustrup 写道:
考虑一个二元运算符@。如果 x 是 X 类型并且 y 是 Y 类型,则 x@y 的解析如下:
• 如果 X 是一个类,则寻找 operator@ 作为 X 的成员或作为 X 的基的成员;和
• 在 x@y 周围的上下文中查找 operator@ 的声明;和
• 如果 X 在命名空间 N 中定义,则在 N 中查找 operator@ 的声明;和
• 如果 Y 定义在命名空间 M 中,则在 M 中查找 operator@ 的声明。
可以找到多个 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 到底是什么意思呢?
【问题讨论】:
标签: c++ operator-overloading member-functions argument-dependent-lookup non-member-functions