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

vkn*_*vkn 0 c++ lambda capture unique-ptr

考虑以下:

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
Run Code Online (Sandbox Code Playgroud)

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

也许撇开lambda的非正统用法,我如何找回unique_ptr?它会永远被困在lambda中吗?

Nat*_*ica 6

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

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

// or

auto lambda = [&foo]()
    {
        /* Do something with foo */
    };
Run Code Online (Sandbox Code Playgroud)

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

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

  • 到那时,您最好只捕获`[int_ptr = foo.get()]`。无论如何,它是一个没有所有权的指针。保留对“ unique_ptr”的引用似乎有点奇怪。 (3认同)