c++ - 打印 reference_wrapper 的向量
问题描述
我有以下可在 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,2,4,5,而不是 5。
- 该代码不适用于非clang。问题出在哪里?
解决方案
i
是其声明循环内的局部变量。for
它是向量中每个的副本。因此,您(通过调用)创建引用局部变量的对象,在被引用变量 ( ) 的生命周期结束后保持引用活动。这是未定义的行为。int
vs
emplace_back()
reference_wrapper
i
解决方法是i
引用each,int
而不是copy,这样s按预期reference_wrapper
引用int
s :vs
for (int& i : vs)
推荐阅读
- android - 如何在订阅之外使用变量
- android - 在 Kotlin 上为 Google Maps Api 创建动态标记并通过变量访问
- php - 订单完成时 WooCommerce 触发功能,但其中调用的 Python 脚本不执行
- lua - Lua如何从远程http请求文件
- kotlin - Kotlin JVM - Char MAX_CODE_POINT - 未解决的参考
- python - 如何在 TensorFlow Eager 模式下使用复杂变量?
- java - 使用 az 输入循环
- c# - C# | 使用 for 循环创建多个线程,执行不同的任务
- php - 如何组合两个具有相同名称的输入?
- arrays - PowerShell:差异 [array] 与 [array[]]