gpt4 book ai didi

C++ 函数返回一个右值,但可以分配一个新值?

转载 作者:太空狗 更新时间:2023-10-29 23:13:31 26 4
gpt4 key购买 nike

代码如下:

 #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&)’

它说我不能将右值作为非常量引用的参数传递,但我感到困惑的是为什么我可以分配给这个右值,正如代码所示。

最佳答案

将右值 rtByValue() 传递给需要左值引用的函数是行不通的,因为这需要从右值初始化左值引用参数。 §8.5.3/5 描述了如何初始化左值引用——我不会完整引用它,但它基本上说左值引用可以被初始化

  • 来自另一个左值引用
  • 或者可以转换为中间类型的左值引用的东西
  • 或者来自右值,但前提是我们初始化的左值引用是常量引用

因为我们需要初始化的参数不是常量引用,所以这些都不适用。

另一方面,

rtByValue() = aa; 

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

(§3.10/5) An lvalue for an object is necessary in order to modify the object except that an rvalue of class type can also be used to modify its referent under certain circumstances. [ Example: a member function called for an object (9.3) can modify the object. — end example ]

所以这仅是因为 A 是类类型的,并且(隐式定义的)赋值运算符是一个成员函数。 (有关详细信息,请参阅 this related question。)

(因此,如果 rtByValue() 返回一个 int,那么赋值将不起作用。)

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com