標籤:

為什麼 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比?

TAG:編程語言 | C | CC |