C++:如何从 lambda 获取 "un-capture"不可复制对象(例如 unique_ptr)?

标签 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 中吗?

最佳答案

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

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

// or

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

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

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

关于C++:如何从 lambda 获取 "un-capture"不可复制对象(例如 unique_ptr)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55029034/

相关文章:

容器拥有的对象的确定性销毁(或者如何将 Unique (std.typecons.Unique) 放入 D Phobos 容器中)?

java - 如何在 Spock Groovy 中模拟 Java 8 函数

c++ - 不可移动的 C++17 唯一指针

c++ - 为什么在打印 BST 的前序遍历时我的程序什么都不做

c++ - 为什么这段代码涉及使用对临时段错误的引用,尽管它似乎正确地管理了生命周期?

python - 传递给另一个模块时 lambda 函数的范围

c# - 使用 lambda 重新定义函数或调用标准 API (Math.Ceiling)

c++ - std::unique_ptr、删除器和 Win32 API

c++ - 如何在不使用 while 1 和 if 的情况下从 sqlite3 获取数据

c++ - 是一个堆栈指针伪随机数的良好来源