operator =重载返回参数而不是* this

时间:2014-06-26 15:47:53

标签: c++ operator-overloading

我有一个理论问题:

通常,在operator =实现中,它返回* this。但是,如果我们改为返回* other,其他是指派的右手边,会发生什么呢?

由于

3 个答案:

答案 0 :(得分:0)

从赋值运算符返回*this的目的是允许赋值链,例如

int x = 2;
int y = x = 5; // Equivalent to: 'int y = (x = 5);'

复制赋值运算符通常声明为:

T& operator=(const T& other);

此处,参数other被声明为const,因此无法返回。由const T&返回也会有不同的行为,因为调用者无法分配给返回的引用,因此不允许分配链接。

通常你也会分配一个临时的。如果您自定义赋值运算符的行为以返回对此临时值的引用,则可能导致悬空引用和其他危险行为。

std::string s;
(s = "abc") = "def"; // Can't assign to rhs.

可以自定义赋值运算符的行为以实现不同的行为,您通常应该避免这样做以保持运算符的含义清晰。如果您想要自定义行为,那么提供具有良好描述性名称的功能会更好。

有关运算符重载的详细信息可以是found here

答案 1 :(得分:0)

返回原因*这是为了启用此表格中的作业

a = b = c

这与

相同
a.operator=( b.operator=(c))

如果你返回其他,编译器将无法编译这种分配。

答案 2 :(得分:0)

他们将是两个事实上的差异:

  • 您将被迫从const或副本
  • 返回对operator=个实例的引用
  • 您的作业将在其右侧而不是左侧返回参考

大多数情况下,这意味着你会惊讶于一些可能利用你的作业返回值的开发人员认为它会像大多数对象一样回复左手边。

但是没有那么多人打算写下这样的事情:

(a = b).do_action();

由于您刚刚为左侧分配了正确的值并且您正在返回const实例或副本,因此大多数操作很可能会导致相同的操作,无论它们是否被调用左边或右边的实例。所以基本上大部分时间它都不会改变你的生活。

但是,除非您是boost::spirit开发人员,否则我们强烈建议您避免这些事情以保证同事的理智:)