C++ 函数返回机制:临时对象、R值、L值

C++ 函数返回机制:临时对象、R值、L值,c++,function,assembly,return-value,C++,Function,Assembly,Return Value,在低级别分析问题时,当函数返回值时,它将在cpu寄存器中或调用方先前在堆栈上分配的空间中返回。 此时,调用函数可以获取该值并将其复制到其局部变量中 int sum(int a,int b){return a + b;} int main(){int risultato = sum(10,20);return 0;} 在这种情况下,sum函数返回EAX寄存器中的值。然后,main函数将值从eax寄存器复制到堆栈上的内存位置 这就是真正发生的事情 现在转到C++的抽象,如果我尝试执行以下操作:

在低级别分析问题时,当函数返回值时,它将在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; 这给了我一个错误。 这基本上是因为函数返回的不是包含值的内存位置,而是值本身。 因此,作为r值,这是不可分配的,因为不可能将一个值分配给另一个值。 当使用解引用运算符*时,问题变得完全不同。 在这种情况下,将不会返回值,而是返回内存位置本身(l值),因此该位置是可分配的

我写的对吗

现在我们来看第二个例子

class class1 {public: int i; int b; class1(int i,int b) { this->i = i;this->b = b; }};
class1fun(){class1c(10,5);返回c;}

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

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

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

class1(10,20).i = 4;
在这种情况下,我正在创建一个临时对象,我不明白为什么它不给我分配对象变量I的可能性,为什么在这种情况下它总是被解释为r值而不是l值? 我知道我所做的在实践中毫无用处,但这仍然是一个纯粹的理论问题,我需要正确理解语言的语法

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

我知道我现在所做的在实践中毫无用处

以下是你问题的答案:

为什么在这种情况下,它总是被解释为r值而不是l值

如果编译器需要将其设置为L值,那么实现编译器就比较困难,而且因为它没有任何用处,所以不值得这么麻烦

有些事情只是为了方便编译器编写人员

我知道我现在所做的在实践中毫无用处

以下是你问题的答案:

为什么在这种情况下,它总是被解释为r值而不是l值

如果编译器需要将其设置为L值,那么实现编译器就比较困难,而且因为它没有任何用处,所以不值得这么麻烦

有些事情只是为了方便编译器编写人员

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

我写的对吗

有点。你说

这是因为函数基本上不返回包含该值的内存位置

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

因此,作为r值,这是不可分配的,因为不可能将一个值分配给另一个值

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

在这种情况下,我正在创建一个临时对象,我不明白为什么它不给我分配对象变量I的可能性,为什么在这种情况下它总是被解释为r值而不是l值

原因是使用
操作符。
如果调用它的对象是右值,则访问的成员将被视为右值。由于
i
是一种内置类型,并且是右值,因此无法为其赋值

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

我写的对吗

有点。你说

这是因为函数基本上不返回包含该值的内存位置

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

因此,作为r值,这是不可分配的,因为不可能将一个值分配给另一个值

这仅适用于内置类型。内置类型的赋值运算符