C++函数返回一个rvalue,但是可以为其赋值?

hai*_*g31 8 c++ temporary rvalue assignment-operator

代码如下:

 #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;
 }
Run Code Online (Sandbox Code Playgroud)

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&)’
Run Code Online (Sandbox Code Playgroud)

它说我不能将rvalue作为非const引用的参数传递,但是我很困惑的是为什么我可以分配给这个rvalue,就像代码所示.

jog*_*pan 10

将rvalue传递rtByValue()给期望左值引用的函数不起作用,因为这需要从rvalue初始化左值引用参数.§8.5.3/ 5描述了如何初始化左值引用 - 我不会完全引用它,但它基本上表示可以初始化左值引用

  • 来自另一个左值参考
  • 或者可以转换为中间类型的左值引用的东西
  • 或者来自右值,但只有当我们初始化的左值参考是一个const参考时

由于我们需要初始化的参数不是const-reference,因此这些都不适用.

另一方面,

rtByValue() = aa; 
Run Code Online (Sandbox Code Playgroud)

即,分配给临时对象是可能的,因为:

(§3.10/ 5)对象的左值是必要的,以便修改对象,除了在某些情况下也可以使用类类型的右值来修改它的指示对象.[示例:调用对象(9.3)的成员函数可以修改对象. - 结束例子]

所以这只是因为A是类型的,而(隐式定义的)赋值运算符是一个成员函数.(有关详细信息,请参阅此相关问题.)

(所以,如果rtByValue()要返回,例如,一个int,那么分配将不起作用.)