楼主:
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(自定义类型)?
请问书中这句话是否有瑕疵?
谢谢
应该说他的右值还是个位址 只是是区域变量的你可以试着在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=
对吼 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 的陷阱