C++ 在std::unique\u ptr下移动值

C++ 在std::unique\u ptr下移动值,c++,memory-management,unique-ptr,C++,Memory Management,Unique Ptr,我有一个函数foo(T值),其中T是move only。我想(出于某些原因)分配T类型的value,并调用foo 我可以这样做吗 { std::unique_ptr<T> ptr = make_unique<T>(T()); foo(std::move(*ptr)); } 根本没有理由使用指针: void HandleCLient(Socket socket){ //... } //... while (true) { //Construct

我有一个函数
foo(T值)
,其中
T
是move only。我想(出于某些原因)分配
T
类型的
value
,并调用
foo

我可以这样做吗

{
  std::unique_ptr<T> ptr = make_unique<T>(T());
  foo(std::move(*ptr));
}

根本没有理由使用指针:

void HandleCLient(Socket socket){
    //...
}

//...

while (true) {
    //Construct in-place
    Spawn([s=Socket(acceptor.Accept)]() mutable
    {
      HandleClient(std::move(s));
    }).Detach();
}

感谢@rafix07指出需要添加
mutable

完全没有理由涉及指针:

void HandleCLient(Socket socket){
    //...
}

//...

while (true) {
    //Construct in-place
    Spawn([s=Socket(acceptor.Accept)]() mutable
    {
      HandleClient(std::move(s));
    }).Detach();
}

感谢@rafix07指出需要添加
mutable

为什么在lambda中没有创建
socket
?似乎它是专用于此的。您至少应该显示“仅移动”的函数,因为您正在询问有关移动语义的问题,完全有可能您对函数本身感到困惑。为什么
socket
不是在lambda内部创建的?看起来它是专用的,你至少应该显示“仅移动”的函数,因为你在问一个关于移动语义的问题,你完全可能对函数本身感到困惑。