考虑以下几点:
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/