C ++:如何从lambda中“捕获”不可复制的内容(例如unique_ptr)?

时间:2019-03-06 17:33:18

标签: c++ lambda unique-ptr capture

请考虑以下内容:

unique_ptr<int> foo = make_unique<int>(42);

auto lambda = [bar = move(foo)]()
    {
        /* Do something with bar */
    };

lambda(); // No issues invoking this

cout << "*foo = " << *foo; //Attempts to dereference foo will segfault

要捕获诸如unique_ptr之类的东西,需要使用std :: move,以保持unique_ptr的唯一性。但是,当我想在销毁lambda之后使用同一智能指针时该怎么办?使用foo将产生段错误,并且bar超出了该范围。

也许不合常规地使用lambda,如何恢复我的unique_ptr?它会永远被困在lambda中吗?

2 个答案:

答案 0 :(得分:6)

这可以通过引用捕获来解决。

auto lambda = [&]()
    {
        /* Do something with foo */
    };

// or

auto lambda = [&foo]()
    {
        /* Do something with foo */
    };

允许您使用foo,而无需实际移动它。

唯一需要注意的是,要确保lambda的寿命不超过指针的寿命。如果可以,那么您应该考虑使用共享所有权方法,例如使用std::shared_ptr

答案 1 :(得分:3)

  

但是当我想在销毁lambda之后使用相同的智能指针时该怎么办?

您使用std::shared_ptr,并且不要移动要重用的内容。

auto foo = std::make_shared(42);
auto lambda = [bar=foo]()
{
    /* Do something with bar */
};
lambda(); // No issues invoking this
cout << "*foo = " << *foo; // also fine