赋值运算符的返回值可以作为参考吗?

时间:2017-08-23 19:06:50

标签: c++

我很惊讶今天在同事的代码中看到了一些语法。

void doSomething(bool& boolRef);

bool ok = true;
doSomething(ok = false);

我认为这是一个错误,因为param中的赋值运算符ok = false返回赋值的值,在本例中为false。由于doSomething期待引用,我的第一反应是“那应该不起作用”,因为它看起来几乎与执行doSomething(false);

相同

但唉它确实有效。并且重新分配doSomething内部的引用值就像你期望的那样。

有人可以解释为什么会有效吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

Foo的规范赋值运算符如下所示:

class Foo {
  ...

  Foo& operator=(const Foo& other) {
    // make this the same as other
    return *this;
  }
};

正如您所看到的,它确实返回了一个引用。在这种情况下,对象是ok,因此它返回对ok的引用,这是一个左值,这就是调用的原因。

Bool当然不是一个类,但是它的工作方式相同,这是为什么规范赋值运算符就像这样编写。

顺便说一下,我个人并非真的非常关心利用这一点,我可能会将doSomething(ok=false)写成两行,我怀疑其他人也会这样做。

答案 1 :(得分:3)

赋值返回对所分配对象的引用(不是从中分配的对象),在本例中是左值ok,因此代码也可以,但可能不是很好。