C++ 函数返回机制:临时对象、R值、L值
在低级别分析问题时,当函数返回值时,它将在cpu寄存器中或调用方先前在堆栈上分配的空间中返回。 此时,调用函数可以获取该值并将其复制到其局部变量中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++的抽象,如果我尝试执行以下操作:
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值,这是不可分配的,因为不可能将一个值分配给另一个值
这仅适用于内置类型。内置类型的赋值运算符