gpt4 book ai didi

c++ - vector 修改后引用 vector.back() 的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:21 25 4
gpt4 key购买 nike

让我们从这个 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 是 vector 中一个项目的引用,不应通过将项目附加到 vector 来修改它。

但是我目前还没有阅读反汇编代码或进行任何其他调查。我也不知道这是否是语言标准中未定义的行为。

我想解释一下。谢谢。

最佳答案

push_back如果我们查看 draft C++ standard,可能会导致重新分配23.3.6.5 vector modifiers 部分说:

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++ - vector 修改后引用 vector.back() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com