代码如下:
#include <iostream>
using namespace std;
class A {
};
A rtByValue() {
return A();
}
void passByRef(A &aRef) {
// do nothing
}
int main() {
A aa;
rtByValue() = aa; // compile without errors
passByRef(rtByValue()); // compile with error
return 0;
}
g++编译器给出以下错误:
d.cpp: In function ‘int main()’:
d.cpp:19:23: error: invalid initialization of non-const reference of type ‘A&’ from an rvalue of type ‘A’
d.cpp:12:6: error: in passing argument 1 of ‘void passByRef(A&)’
它说我不能将右值作为非const引用的参数传递,但是我感到困惑的是,为什么我可以分配给该右值,正如代码所示。
最佳答案
将右值rtByValue()
传递给需要左值引用的函数不起作用,因为这将需要从右值初始化左值引用参数。第8.5.3/5节描述了如何初始化左值引用–我不会完整引用它,但它基本上说左值引用可以被初始化
另一个左值引用的
由于我们需要初始化的参数不是const引用,因此这都不适用。
另一方面,
rtByValue() = aa;
即,由于以下原因,可以分配给临时对象:
因此,这仅是有效的,因为
A
是类类型的,并且(隐式定义的)赋值运算符是成员函数。 (有关更多详细信息,请参见this related question。)(因此,如果
rtByValue()
返回,例如int
,则该分配将不起作用。)关于C++函数返回一个右值,但是可以分配一个新值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15824750/