作者:
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 的陷阱