在操作员查找中,不会优先考虑非成员

时间:2015-04-22 21:07:26

标签: c++ operator-overloading member-functions argument-dependent-lookup non-member-functions

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?

0 个答案:

没有答案