【问题标题】:Why not return const-reference in operator= instead of a reference?为什么不在 operator= 中返回 const-reference 而不是引用?
【发布时间】:2020-07-17 10:42:05
【问题描述】:

在赋值运算符重载时,为什么我们返回对对象的引用,为什么它不能返回常量引用?例如,在这种情况下:

MyClass& MyClass::operator=(const MyClass &rhs) {
    ...  // Do the assignment

    return *this;
  }

为什么我们不能返回像这样的常量引用:

const MyClass& MyClass::operator=(const MyClass &rhs) {
    ...  // Do the assignment operation!

    return *this;  // Return a reference to myself.
  }

【问题讨论】:

  • 你可以,但你为什么要呢? *this 在这里是非常量的,为什么要添加常量?
  • 当然可以,但它有什么好处呢?如果这样做,您将禁止使用 (a = b).NonConstMember(); 之类的表达式。
  • 返回类型可以是MyClass const&。它甚至可以是void。对于期望(并依赖)更典型行为的人来说,其中任何一个都可能令人惊讶。

标签: c++


【解决方案1】:

可以,但MyClass 的用户可能会感到惊讶。

通常,可以对分配进行引用(在较少情况下,可以再次分配分配)。正确用词有点令人困惑,所以它看起来像这样:

int a = 4;
int &r = a = 5;
(a = 6) = 7;

这也不允许调用修改函数参数的成员函数,例如:

#include <iostream>

struct C
{
    int value;
    const C &operator=(int v){value = v; return *this;}
};

void assign_value(C &ref)
{
    ref %= 4;
}

int main(void)
{
    C test;
    assign_value(test = 5);
    std::cout << c.value << '\n';
}

【讨论】:

  • 对不起,我有点看不懂,请您简化一下
  • @Souravkumar 这更好吗?
  • 老实说,我更喜欢在我的应用中禁止此类代码:(test=5).multiply_by(4)。
  • @Gupta 这只是一个人为的例子。我确信有一些更好的方法可以表明 const 上的 operator= 返回值是不好的,但我现在想不出一个。
  • foo(test = 5); 可能是一个更“频繁”的例子。链式初始化(test = myObject).SetSpeed(42).SetAccelleration(12);(但我不认为他们在这种情况下使用operator=)。
猜你喜欢
  • 2018-07-30
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2012-01-14
相关资源
最近更新 更多