C++:如何从 lambda 中"un-capture"不可复制的内容(例如 unique_ptr)?

C++: How do I "un-capture" non-copyables (eg. unique_ptr) from a lambda?

本文关键字:例如 unique ptr 可复制 lambda un-capture C++      更新时间:2023-10-16

考虑以下内容:

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 ::移动,以维持unique_ptr的唯一性。但是,当我想在破坏Lambda之后使用相同的智能指针时该怎么办?使用foo将给出一个segfault,而栏则不超出范围。

也许是非正统的lambda使用,我如何将我的unique_ptr返回?它永远被困在lambda中吗?

这可以通过参考捕获。

来解决。
auto lambda = [&]()
    {
        /* Do something with foo */
    };
// or
auto lambda = [&foo]()
    {
        /* Do something with foo */
    };

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

唯一的警告是,要确保Lambda的寿命不超过指针的寿命。如果可以/这样做,那么您应该考虑使用共享所有权方法,例如使用std::shared_ptr

但是,当我想在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
相关文章: