C 可修改右值問題?

時間 2021-05-31 10:12:38

1樓:

c++11引入的& &&限制符直接不允許把this繫結到右值/左值上

可參見 primer 5 13.6

對於題外話析構的流程是先執行析構函式體再執行隱式的析構階段所謂隱式析構階段上邊已經說得很清楚了

再題外話樓主該換書了

2樓:邱昊宇

來自標準文件 §3.10 (5)

An lvalue for an object is necessary in order to modify the object except that an rvalue of class type can also be used to modify its referent under certain circumstances. [ Example: a member function called for an object can modify the object.

— end example ]

大意:必須通過左值才能修改物件;除非這是乙個 class 型別的物件,此時,在某些情況下也可以通過其右值修改該物件。[ 例:呼叫該物件的成員函式可以修改該物件。]

s1 + s2 是右值,std::string 是 class 型別,於是,可以通過成員函式 std::string::operator= 修改。

int 型別不是 class 型別,所以只能通過左值修改。

題外話:析構函式的作用不是釋放該物件所佔的記憶體。

3樓:藍色

的確如 @劉城所述,這乙個是呼叫的過載操作符=。為了直觀你的認識,你可以參看我剛才在MyMiniString新加入operator=後的Output 2的結果,這與內建型別是不同的。

而對於第二個問題,如int型別的變數,需要看你是使用new進行動態分配還是使用棧了。如果是new動態分配,需要你自己去delete掉。而如果是棧的話,在其生命週期結束後,會自動釋放其記憶體所佔空間。

4樓:陳碩

一直就是這樣,臨時物件能呼叫成員函式,乙個道理。

Non-static member functions

(since C++11) A non-static member function can be declared with either an lvalue ref-qualifier (the character & after the function name) or rvalue ref-qualifier (the character && after the function name.

5樓:

1. 普通型別的變數只能對左值賦值。 string的 =是過載的operator=,只是乙個一般的成員函式呼叫,沒這個需求。

2. 標準庫銷毀時不是呼叫析構函式來釋放空間的...... 你delete乙個物件時,系統是先調析構,再釋放空間,是delete釋放的空間,不是析構釋放的空間.......

當然你析構裡面可以delete別的指標,但那是另外一碼事了

C 模板右值引用推導的問題?

情況是這樣的 int i 10 foo i 首先進行 name lookup 找到了 2 個 foo,然後進行模板引數的歸約.第 1 個是 foo T with T int 第 2 個是 foo const T with T int 之後進行過載決議,優先順序從 完美匹配 型別提公升 型別轉換 依次...

c 中如何理解「左值」和 「右值」 左值是不是儲存在stack上,而右值是儲存在heap上?

AlseinX 從字面意思理解,左值和右值是指出現在賦值等號的左邊和右邊的值。右值只能出現在等號右邊,而左值只能出現在等號的左邊。左值是指變數或具有變數語義的表示式,是記憶體空間中 無論是堆還是棧 分配出來的一段用於儲存值的空間。而右值是乙個具體的,可以被計算 被得出 被儲存的資料。例如,有乙個in...

c 把左值賦給左值和把右值賦給左值有什麼區別?

劉雲賓 後者會呼叫移動賦值運算子,前者只會呼叫普通複製運算子,即,後者 y 的值會改變,當然是在有移動賦值運算子的情況下 下面的程式,會測試兩者的不同 include include include int mainstd string y 123456 std string x x y std c...