【问题标题】:In operator lookup no preference is given to members over nonmembers在运算符查找中,成员优先于非成员
【发布时间】: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


    【解决方案1】:

    您的代码只能编译,因为您的运算符在此上下文中不等效。根据隐式转换顺序排序规则,一种优于另一种。

    请注意,您的成员运算符的第一个(左)参数缺少 const 限定。它实际上代表bool operator==(A&, const A&)

    由于main 中的ab 未声明为const,因此左侧操作数的隐式转换序列更短(更好)成员 运算符。它不需要将aA 转换为const A。这就是使它成为更好的候选人的原因。这就是选择您的成员函数版本的原因。

    要使两个版本等效,您必须将const 添加到您的成员运算符声明中

    class A
    {
    public:
        bool operator==(const A&) const
        {
            return true;
        }
    };
    

    这将立即使您的 a == b 比较模棱两可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多