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

问题描述 投票:0回答:2

考虑以下:

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吗?

c++ lambda unique-ptr capture
2个回答
6
投票

这可以通过参考捕获来解决。

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

// or

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

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

唯一需要注意的是,确保lambda的生命周期不超过指针的生命周期取决于你。如果它可以/做,那么你应该考虑使用共享所有权方法,比如使用std::shared_ptr


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
© www.soinside.com 2019 - 2024. All rights reserved.