c++ 如何从lambda中分配unique_ptr值

y0u0uwnf  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(139)

我有一个需要在lambda函数中分配一个唯一的ptr值的情况。

std::unique_ptr<SomeType> unique_ptr_obj;

// Lambda below has fixed return type.
bool var = ()[unique_ptr_obj=std::move(unique_ptr_obj)]-> bool {
 unique_ptr_obj = GetUniqueObject();
 return true 
} ();
 
// Should be able to use unique_ptr_obj
UseUniqueObject(unique_ptr_obj.get());

然而,正如预期的那样,unique_ptr_obj是nullptr,因为它被移到了lambda中。有没有一种方法可以从lambda中填充unique_ptr_obj,并能够在以后重用它?
有什么建议吗?我应该把unique_ptr_obj转换成shared_ptr吗?

toe95027

toe950271#

你应该修改lambda的声明,通过引用来捕获unique_ptr_obj

bool var = [&unique_ptr_obj]() -> bool {
    // Whatever the next line does, now it changes that variable by reference.
    // Otherwise you were changing a local copy.
    unique_ptr_obj = GetUniqueObject();
    return true;
} ();
2guxujil

2guxujil2#

你不想共享所有权,或者你想共享所有权,但这对lambda给unique_ptr_obj赋值没有帮助,因此使用shared_ptr不是解决方案。
你也不想从unique_ptr_obj移动。草率地说,从某个东西移动意味着让它处于空的状态。
如果你想让一个函数修改它的参数,那么你可以通过引用传递;如果你想让一个lambda修改外部作用域中的某个东西,那么你可以让它通过引用捕获它。
无论是int还是unique_ptr,这都是一样的:

int x = 0;
bool value = [&x]() { x = 42; return true; } ();
         //   ^^ capture x by reference

assert(x == 42);

相关问题