C++ C++;:“我该怎么做?”;“联合国捕获”;来自lambda的非可复制(例如,唯一的\u ptr)?

C++ C++;:“我该怎么做?”;“联合国捕获”;来自lambda的非可复制(例如,唯一的\u ptr)?,c++,lambda,unique-ptr,capture,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 dereferenc

考虑以下几点:

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 foo=make_unique(42);
自动lambda=[bar=move(foo)]()
{
/*用酒吧做点什么*/
};
lambda();//调用此命令没有问题
库特
但是,当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
auto-foo=std::使_共享(42);
自动lambda=[bar=foo]()
{
/*用酒吧做点什么*/
};
lambda();//调用此命令没有问题

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

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

// or

auto lambda = [&foo]()
    {
        /* Do something with foo */
    };
允许您使用
foo
,而无需实际移动它


唯一需要注意的是,由您来确保lambda的生存期不超过指针的生存期。如果可以,那么你应该考虑共享所有权方法,比如使用<代码> STD::SysDypPTR 。

注意,在移动后,不能使用UNIQUYPPTR。实际上,lambda是否被破坏并不重要。在
move(foo)
之后,
foo
已经处于“moved from”状态,您不能再取消对它的引用。唯一允许您使用它的是为它分配新的内容。此时,您最好捕获
[int\u ptr=foo.get()]
。无论如何,它是一个非所有者指针。持有对
unique\u ptr
的引用似乎有点奇怪。这是有道理的,我想我低估了unique\u ptr的独特性。非常感谢!