為什麼 C++ 中 a=b 會返回 a 的引用?
看程序計算實習的視頻,這裡說(a=b)=c中,a=b返回a的引用,所以重載=運算符時,返回值最好也是一個引用。但是為什麼a=b相當於是a的引用呢
這裡我說明 C 和 C++ 的一個差異點:
int a, b;
(a = b) = 1; // C 語言編譯錯誤;C++ 編譯成功
因為在 C 里,a = b 是返回一個右值(rvalue / non-lvalue)的。參考 Assignment operators
Assignment also returns the same value as what was stored in lhs (so that expressions such as a = b = c are possible). The value category of the assignment operator is non-lvalue (so that expressions such as (a=b)=c are invalid).
但是在 C++,a = b 是返回左值(lvalue)的。參考 Assignment operators
The direct assignment operator expects a modifiable lvalue as its left operand and an rvalue expression or a braced-init-list (since C++11) as its right operand, and returns an lvalue identifying the left operand after modification.
因為 C++ 提供了引用及運算元重載,才可以返回更方便的左值。這種選項對於賦值來說可能看不出有很大用途,但常見的 ostream::opreator&<&<() 就需要返回左值,才能做到 (cout &<&< a) &<&< b。
題主的圖裡就很清楚了啊,c++裡面,運算符的本質是:
class class.operator=(class para)
{ *this = para; return *this;}左值右值問題,推薦同時了解a++和++a的區別。不過話說這個返回值我還真沒注意過。我記得我好像沒重載過=,不過對於+=來說,我看情況寫的。例如BigNumber就返回,計算幾何就是void。
全部刪掉重回答。。
原來我的想法是,因為C++標準規定,a = b 返回a本身,同時是左值,所以operator = 必須返回 引用。
但這裡矛盾了,因為 C的標準是, a = b 返回一個等於a的值,但是右值(是一個臨時變數)。
所以邏輯更應該是,因為C++需要operator = 返回引用,所以強行將非類的 賦值表達式 返回一個左值。於是C++中就多了這種不倫不類的用法 (a=b)=c。
為什麼C++需要operator =返回引用呢。。查了很多東西包括the design evolution of C++,沒有找到答案。大概僅僅是為了效率需求吧。。
如果當年已經有了rvalue reference,可能就沒必要這麼設計了呢。。因為要支持a=b=c這種語法
你讓b=c這個表達式的運算符返回void的話,a=(b=c)這個運算就會出錯。
推薦閱讀:
※python 的 tuple 是不是冗餘設計?
※寫個編譯器,把C++代碼編譯到JVM的位元組碼可不可行?
※C++中int A::*a里的指針a是什麼?
※C/C++ 里指針聲明為什麼通常不寫成 int* ptr 而通常寫成 int *ptr ?
※c語言b++<15是b和15比,還是b+1和15比?