這個問題在這里已經有了答案: 為什么我可以在 begin() 上使用賦值運算子,即使它是一個右值? (1 個回答) 5 小時前關閉。
#include <iostream>
#include <vector>
using namespace std;
int main(void){
vector<int> v = {1, 2, 3};
auto& it = v.begin();
// 1.
v.begin() = 1;
cout << *(v.begin()); // output is 1
// 2.
cout << *(v.begin() 1); // output is 2
}
上面的代碼顯示這v.begin() = 1;不符合我的預期。我不知道 code1 和 code2 之間的實際區別。v.begin() 是左值還是右值?或者什么都沒有?
何時it插入而不是v.begin()兩種情況都回傳 value 2。為什么會發生這樣的事情?
uj5u.com熱心網友回復:
v.begin() 是左值還是右值?
這是一個右值。
auto& it = v.begin();
這是格式錯誤的,因為對非常量的左值參考不能系結到右值。
v.begin() = 1;
這將臨時迭代器推進到開頭,并丟棄結果。
如果目標是不做任何有用的事情,它就“有效”。
cout << *(v.begin()); // output is 1
這通過迭代器間接到開始。
cout << *(v.begin() 1); // output is 2
這將迭代器推進到開頭,而不是丟棄結果,而是間接通過結果迭代器。
v.begin() 不能改變?那么為什么 v.begin() =1 代碼沒有錯誤呢?
您可以更改函式回傳的臨時物件。但是對該臨時物件的更改對v.begin()將來回傳的內容沒有影響。
是的,v.begin() = 1是對右值的復合賦值。如果您來自 C,您可能會對此感到驚訝,因為您可能已經了解到“只有左值可能是賦值的左運算元”。但是在 C 中,它只適用于基本型別,不適用于一般的型別別。
為您自己的類定義賦值運算子多載時,使用左值參考限定的成員函式可能很有用,這將阻止直接賦值給右值,從而阻止諸如v.begin() = 1.
Ref 限定符后來被添加到標準中(在 C 11 中),所以預先存在的標準庫類不能有這些限定符,因此不幸的是,分配標準型別的右值是可能的。有一個添加限定符的提議,但由于擔心向后兼容性而沒有通過。我不知道為什么,但新標準類的規范也沒有合格的賦值運算子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373606.html
標籤:C
上一篇:使用指標演算法計算陣列中的元素數
下一篇:錯誤未定義的參考類::函式
