gpt4 book ai didi

c++ - 为什么通过 vector> 的元素删除引用值不会使 vector 无效?

转载 作者:行者123 更新时间:2023-12-02 10:06:43 27 4
gpt4 key购买 nike

我发现了 std::reference_wrapper 提供的好工具,但我觉得这种行为很奇怪。

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <numeric>
int main()
{
std::vector<int> vectorA(10);
std::vector<std::reference_wrapper<int>> vec;
std::iota(vectorA.begin(),vectorA.end(),0);

for(auto i: vectorA){
std::cout << "In vectorA: "<< i << " ";
}
std::cout << "\n";

for(unsigned i=0; i< vectorA.size(); i++){
vec.push_back(std::ref(vectorA[i]));
}

for(auto i: vec){
std::cout << "In vec: "<< i << " ";
}
std::cout << "\n";

vectorA.erase(vectorA.begin()+9);

for(auto i: vectorA){
std::cout << "In vectorA: "<< i << " ";
}
std::cout << "\n";


for(auto i: vec){
std::cout << "In vec: "<< i << " ";
}
std::cout << "\n";

}

为什么删除 vec (vectorA[9]) 中引用的元素不会影响 vector vec 的大小?此外,为什么 vec[9] 仍然可以访问?

最佳答案

std::reference_wrapper 存储对对象的引用。它不会以任何方式影响被引用对象的生命周期,并且您 promise 在被引用对象被销毁后您不会尝试使用 std::reference_wrapper。这样做的惩罚是未定义的行为

因此,当您从 vectorA 中删除引用元素时,vec 中的引用包装器现在无效,但是它不知道,您不能告诉。现在,对该引用包装器对象的任何使用都会导致未定义的行为。

未定义行为的一个可能后果是您的程序继续运行,这就是这里发生的情况。您尝试使用无效的引用包装器对象,并返回一个值,但这并不意味着该程序是有效的。

关于c++ - 为什么通过 vector<reference_wrapper<T>> 的元素删除引用值不会使 vector 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59895661/

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