代码如下:

 #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-reference


  • 由于我们需要初始化的参数不是const引用,因此这都不适用。

    另一方面,
    rtByValue() = aa;
    

    即,由于以下原因,可以分配给临时对象:



    因此,这仅是有效的,因为A是类类型的,并且(隐式定义的)赋值运算符是成员函数。 (有关更多详细信息,请参见this related question。)

    (因此,如果rtByValue()返回,例如int,则该分配将不起作用。)

    关于C++函数返回一个右值,但是可以分配一个新值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15824750/

    10-13 06:24