在lambda中缺少参考参数

时间:2016-01-08 17:23:52

标签: c++ lambda stl

我正在获取文件的数据作为字节块(向量)的队列。 并且需要启动一个线程以将此数据转储到文件中。 没有线程代码工作正常(如果将lambda body放到函数本身)。但是使用lambda线程函数它不起作用。

首先 - lambda中的路径是空的, while(!one_file.empty())推迟循环体,即使队列大小不是零。

参数传递和捕获可能出现什么问题?

std::thread dump_to_file(std::string path,  std::queue<std::vector<char>>&& one_file) {
    return std::thread {[&]() {
            std::ofstream out((path + ".bak").c_str());
            while (!one_file.empty()) {
                std::copy(one_file.front().begin(), one_file.front().end(), std::ostream_iterator<char>(out));
                one_file.pop();
           }
   }};
}

1 个答案:

答案 0 :(得分:3)

您正在捕获对函数局部变量的引用。从函数返回时path超出范围,所以现在你的lambda引用了一个被破坏的对象。如果你改为按值([=])捕获,那么变量将存在于lambda对象中。

您也可以通过引用将两个变量传递给函数,然后您可以通过引用捕获它们,因为它们仍然存在于dump_to_file的调用站点