gpt4 book ai didi

C++11 lambda 无法访问引用

转载 作者:太空狗 更新时间:2023-10-29 23:39:21 26 4
gpt4 key购买 nike

我在使用 C++ 中的 lambda 函数时遇到问题:我正在尝试定义一个异步加载器,它在给定字符串列表作为输入的情况下填充对象数组。

代码看起来像这样(不完全是,但我希望你明白了):

void loadData() {
while (we_have_data()) {
std::string str = getNext();
array.resize(array.size() + 1);
element &e = array.back();
tasks.push_back([&, str] () {
std::istringstream iss(str);
iss >> e;
}
}

for (auto task: tasks) {
task();
}
}

当我最后扫描任务列表并执行它们时,应用程序在第一次访问 lambda 中的变量 e 时崩溃。如果我在调试器中运行,我可以在对象 e 本身中找到正确的值。我做错了什么,但我真的不明白是什么。

最佳答案

您持有悬空引用。当你做的时候

tasks.push_back([&, str] () {
std::istringstream iss(str);
iss >> e;
}

您通过引用捕获 array.back() 返回的元素,因为对 e 的引用实际上是对任何 e 引用的引用到。不幸的是,在 while 循环中调用了 resize,因此当 array 调整大小时,对 back() 的引用无效,您现在指的是一个对象不再存在。

关于C++11 lambda 无法访问引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36599840/

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