gpt4 book ai didi

c++ - 函数返回机制 :Temporary object, R-Value, L-Value

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:07 24 4
gpt4 key购买 nike

从底层分析这个问题,当一个函数返回一个值时,它要么在 cpu 寄存器中返回,要么在调用者先前在堆栈上分配的空间中返回。此时调用函数可以获取值并将其复制到其局部变量中。

int sum(int a,int b){return a + b;}

int main(){int risultato = sum(10,20);return 0;}

在这种情况下,sum 函数返回 EAX 寄存器中的值。然后 main 函数将值从 eax 寄存器复制到堆栈上的内存位置。

这才是真正发生的事情。

现在转到 C++ 的抽象,如果我尝试执行这样的操作:总和 (10.20) = 4;它给了我一个错误。这是因为基本上函数不返回包含值的内存位置,而是返回值本身。因此,作为右值,这将不可分配,因为不可能将一个值分配给另一个值。当使用取消引用运算符 * 时,问题变得完全不同。在这种情况下,它不会返回值,而是内存位置本身(左值),因此它是可分配的。

我写的对吗?

现在让我们来看第二个例子。

class class1 {public: int i; int b; class1(int i,int b) { this->i = i;this->b = b; }};

class1 fun() { class1 c(10,5);返回 c; }

int main() {fun().i = 4; return 0;}

在这种情况下,函数返回一个对象。如果我尝试执行这样的指令:乐趣 ()。我 = 4;我总是出错。

我知道调用函数时会在堆栈上创建一个临时对象。将函数返回一个对象,但不是作为变量(左值),而是作为一组值,不可能将其中一个值赋值为 4。

这里的语句似乎也存在同样的问题:

class1(10,20).i = 4;

在这种情况下,我正在创建一个临时对象,我不明白为什么它不给我分配对象变量 i 的可能性,为什么在这种情况下它总是被解释为右值而不是l值?我知道我所做的在实践中没有用,但这仍然是一个纯理论问题,我需要正确理解语言的语法。

你能评论一下我到目前为止所说的一切,表达你的观点,并尝试回答最后一个问题吗?

最佳答案

Moving now to the abstraction of C ++, if I tried to do an operation like this: sum (10.20) = 4; it gives me an error. This is because basically the function is not returning the memory location in which the value is contained, but the value itself. Being therefore an r-value, this will not be assignable, since it is not possible to assign a value to another value. The issue becomes completely different when the dereferencing operator * is used. In this case, it will not be returned a value, but the memory location itself (l-value), which will therefore be assignable.

Is what I wrote correct?

有点。你说

This is because basically the function is not returning the memory location in which the value is contained

但事实并非如此。返回一个对象,该对象有一个值。使它成为右值的原因是该函数“按值返回”(另一个名称是临时对象)。

Being therefore an r-value, this will not be assignable, since it is not possible to assign a value to another value

这仅适用于内置类型。内置类型的赋值运算符要求被赋值的对象是左值。如果您有一个用户定义的类型(classstruct),那么您可以分配给一个右值。

In this case I am creating a temporary object, I don't understand why it doesn't give me the possibility to assign the object's variable i, why in this case is it always interpreted as an r-value and not as an l-value?

原因是对于 operator . 如果您调用它的对象是右值,那么您访问的成员将被视为右值。由于 i 是内置类型和右值,因此您不能对其进行赋值。

关于c++ - 函数返回机制 :Temporary object, R-Value, L-Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59566813/

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