簡體   English   中英

修改了vector之后對vector.back()的引用的奇怪行為

[英]Weird behavior of reference to vector.back() after vector is modified

讓我們從C ++中的示例代碼開始:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> vec;
    vec.push_back(0);
    for (int i = 1; i < 5; i++)
    {
        const auto &x = vec.back();
        std::cout << "Before: " << x << ", ";
        vec.push_back(i);
        std::cout << "After: " << x << std::endl;
    }
    return 0;
}

代碼用g++ test.cc -std=c++11 -O0編譯,結果如下:

Before: 0, After: 0
Before: 1, After: 0  
Before: 2, After: 2
Before: 3, After: 3

我期待第二行輸出

Before: 1, After: 1

因為x是對向量中的項的引用,不應通過將項附加到向量來修改該項。

但是我現在還沒有閱讀反匯編代碼或進行任何其他調查。 此外,我不知道這是否是語言標准中的未定義行為。

我想要解釋一下。 謝謝。

push_back可以導致重新分配,如果我們查看草案C ++標准部分23.3.6.5 向量修飾符說:

void push_back(const T&x);

void push_back(T && x);

備注:如果新大小大於舊容量,則會導致重新分配。 如果沒有重新分配,插入點之前的所有迭代器和引用仍然有效

我們可以看到back給了我們一個參考 ,所以如果有重新分配它將不再有效

vector迭代器(以及對元素的先前引用)可能會失效。 使用它們是不安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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