C++11 lambda 无法访问引用

标签 c++ c++11 lambda

我在使用 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/

相关文章:

C++ 使用 boost 对字符串进行标记并将标记保存为字符串

C++微软的ComPtr和c++的unique_ptr、shared_ptr有什么区别?

Python Lambda 函数使用

c++ - 通过 C++ 克隆 HDF5 文件的函数

c++ - 使用可变参数 lambda 迭代可变参数函数模板的参数

c# - where not in () statement with lambda

c++ - ffmpeg H264 一次编码帧用于网络流

c++:使用存储在数组中的各种参数调用函数?

c++ - 传递对 std::ifstream 的引用作为参数

c++ - 使用 C++11 的成员初始化列表中的初始化列表语法