c – 修改vector之后对vector.back()的引用的奇怪行为

前端之家收集整理的这篇文章主要介绍了c – 修改vector之后对vector.back()的引用的奇怪行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们从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可以导致重新分配,如果我们查看 draft C++ standard部分23.3.6.5向量修饰符说:

void push_back(const T& x);

void push_back(T&& x);

Remarks: Causes reallocation if the new size is greater than the old capacity. If no reallocation happens,all the iterators and references before the insertion point remain valid.

我们可以看到back给了我们一个参考,所以如果有重新分配它将不再有效.

猜你在找的C&C++相关文章