[英]What is the result of assigning to std::vector<T>::begin()?
我對左值和右值有一點了解。 所以我知道我們不能分配一個右值但是非常量左值是可以的。
#include <iostream>
#include <vector>
int main(){
std::vector<int> v{ 1, 2, 3, 4, 5 };
v.begin() = v.end() - 2;
std::cout << *v.begin() << std::endl; // 1
for (auto const& e : v)
std::cout << e << ", ";// 1, 2, 3, 4, 5,
std::cout << std::endl;
}
為什么我可以分配給begin()
但它對元素沒有任何作用?
v.begin()
是一個迭代器。 分配給迭代器不會分配迭代器指向的值。 另外,因為v.begin()
是一個prvalue,所以你指定的對象在行的末尾被銷毀,而不會影響v
或它擁有的任何“永久”內存。
如果v.begin()
是原始指針,編譯器將發出錯誤以嘗試分配給右值。 但是,類型std::vector<T>::iterator
通常是一個類類型,似乎這是你的實現的情況(使用你正在使用的特定編譯器標志集),所以分配給v.begin()
調用該類類型的operator=
。 但這並沒有改變迭代器對象是臨時對象的事實,並且分配給它沒有進一步的效果。
為了分配v.begin()
指向的元素,你需要取消引用它: *v.begin() = *(v.end() - 2)
分配給std :: vector :: begin()的結果是什么?
賦值表達式的結果(在您的示例中將丟棄結果)是指定的值。 在這種情況下,結果與v.end() - 2
。
請注意,由於begin()
返回一個值,因此該賦值僅修改返回的臨時對象。 賦值不會以任何方式修改向量。 鑒於臨時對象被丟棄,分配在實踐中沒有可觀察到的影響。
此外,如果標准庫已選擇將std::vector::iterator
為指針,則此賦值可能不正確。
為什么我可以分配給
begin()
因為
但它對元素沒有任何作用?
因為賦值迭代器不會修改迭代器指向的元素。 相反,賦值會更改迭代器指向的對象。
據我所知,我們無法分配到右值
這一般不正確。 特別是,類型†不是這樣。
†除非類的賦值運算符具有lvalue-ref-qualifier(並且沒有rvalue-ref-qualified重載),這是非常規的。
有時代碼比文字更好地解釋事物。 您的代碼等同於:
std::vector<int> v{ 1, 2, 3, 4, 5 };
{
auto temp = v.begin();
temp = v.end() - 2;
}
std::cout << *v.begin() << std::endl; // 1
for (auto const& e : v)
std::cout << e << ", ";// 1, 2, 3, 4, 5,
std::cout << std::endl;
換句話說, v.begin() = v.end() - 2
沒有可觀察到的影響。 這只是一個臨時任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.