gpt4 book ai didi

c++ - 打印 reference_wrapper 的 vector

转载 作者:行者123 更新时间:2023-12-04 09:28:01 25 4
gpt4 key购买 nike

我有以下可在 clang 下运行的测试代码。

#include <algorithm>
#include <vector>
#include <iostream>

int main() {

std::vector<int> vs{1, 2, 4, 5};

std::vector<std::reference_wrapper<int>> vs1;

for (int i : vs) {
std::cout << "loop: " << i << std::endl;
vs1.emplace_back(i);
}

for (auto p : vs1) {
std::cout << p << std::endl;
}
return 0;
}

您可以将其插入 https://rextester.com/l/cpp_online_compiler_clang (或本地)。结果是:

loop: 1
loop: 2
loop: 4
loop: 5
5
5
5
5
  1. 我预计是 1、2、4、5,而不是 5。
  2. 该代码不适用于非 clang。问题出在哪里?

最佳答案

i 是其声明的 for 循环内的一个局部变量。它是 vs vector 中每个 int拷贝。因此,您(通过 emplace_back() 调用)创建了引用局部变量的 reference_wrapper 对象,在引用变量的生命周期后保持引用有效(i) 已经结束。这是未定义的行为

解决方法是让 i 成为每个 intreference,而不是 copy,这样reference_wrapper 按预期引用 vs 中的 int:

for (int& i : vs)

关于c++ - 打印 reference_wrapper<int> 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60858371/

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