簡體   English   中英

分配給std :: vector的結果是什么? <T> ::開始()?

[英]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()

因為

  1. 迭代器是可分配的。
  2. 類型的Rvalues可以指定
  3. 迭代器恰好是類類型。

但它對元素沒有任何作用?

因為賦值迭代器不會修改迭代器指向的元素。 相反,賦值會更改迭代器指向的對象。

據我所知,我們無法分配到右值

這一般不正確。 特別是,類型不是這樣。


除非類的賦值運算符具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM