我很惊讶今天在同事的代码中看到了一些语法。
void doSomething(bool& boolRef);
bool ok = true;
doSomething(ok = false);
我认为这是一个错误,因为param中的赋值运算符ok = false
返回赋值的值,在本例中为false。由于doSomething
期待引用,我的第一反应是“那应该不起作用”,因为它看起来几乎与执行doSomething(false);
但唉它确实有效。并且重新分配doSomething
内部的引用值就像你期望的那样。
有人可以解释为什么会有效吗?
谢谢!
答案 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
,因此代码也可以,但可能不是很好。