[讨论] 关于函式的返回值

楼主: kkkmode (kkk)   2014-05-05 22:09:41
各位好,
出自C++ primer 5th,简中版 6.3.2 (第202页)
"返回引用的函式得到左值,其他返回类型得到右值"
我对于其他返回类型得到右值有点疑问
以下我写了一小段:
#include <iostream>
using namespace std;
struct a{
int i;
};
a f(a &temp)
{
return temp;
}
int main()
{
a aa,bb;
aa.i=1;
bb.i=3;
f(aa)=bb; //如果返回值是右值为何可以赋值?
return 0;
}
书中讲的"其他类型"是指非class或struct(自定义类型)?
请问书中这句话是否有瑕疵?
谢谢
作者: soheadsome (师大狗鼻哥)   2014-05-05 23:08:00
应该说他的右值还是个位址 只是是区域变量的你可以试着在f(aa)=bb;后面印出aa.i 他本身没变
作者: kattte (诚实面对自己吧!)   2014-05-06 00:12:00
大写E 可以修改内文
作者: AstralBrain   2014-05-06 00:17:00
f(aa)=bb的等号不是赋值是呼叫member function a::operator=
作者: soheadsome (师大狗鼻哥)   2014-05-06 00:19:00
对吼 c++会默认帮你加copy assignment
作者: AstralBrain   2014-05-06 00:19:00
所以是ok的, 和"rvalue不能赋值"这句话没有冲突
作者: purpose (秀才遇到肥宅兵)   2014-05-06 00:54:00
现在像MSDN,都不用"可以放等号左边就是左值"这种解释了很多左值,被加了const后,也一样不能放左边
作者: damody (天亮damody)   2014-05-06 01:18:00
你可以大E修文 写信请版主删文吧
作者: Feis (永远睡不着 @@)   2014-05-06 03:18:00
那什么叫做左值呢? 简答题
作者: purpose (秀才遇到肥宅兵)   2014-05-06 10:07:00
有名称有明确位址可以做&取址,可以靠自己存在超过一expr.右值相反,但可用 const int &i = 1+2; 来延长存在时间
作者: firose (guest也是也是也是也是也)   2014-05-06 12:38:00
可以用 && 接看看是否为右值
作者: Feis (永远睡不着 @@)   2014-05-06 12:57:00
用 && 接的时候要小心 template 的陷阱

Links booklink

Contact Us: admin [ a t ] ucptt.com