unique_ptr,您正在引用已删除的函数

unique_ptr, you're referencing a deleted function

我正在尝试将 unique_ptr 移动到 WriteAsync 方法。这按预期工作。我现在遇到的问题是将唯一指针的所有权移至 strand.post lambda,然后再次将其移至 QueueMessageQueueMessage 需要 std::unique_ptr<std::vector<char>>.

在这种情况下,对我来说最简单的方法就是使用 shared_ptr。我想知道是否有一种方法可以在不使用 shared_ptr.

的情况下完成这项工作
// Caller
static void DoWork( char const* p, int len  )
{
     client.WriteAsync( std::make_unique<std::vector<char>>( p, p + len ) );
}

// Callee
void TcpClient::WriteAsync( std::unique_ptr<std::vector<char>> buffer )
{
    _strand.post( [ this, buffer = std::move( buffer ) ]( ) 
    { 
        // Error on this line.
        QueueMessage( std::move( buffer ) ); 
    } );
}


void TcpClient::QueueMessage( std::unique_ptr<std::vector<char>> buffer )
{
     // Do stuff
}

我看到的错误是:

you're referencing a deleted function

lambda 的函数调用运算符是一个 const 成员函数。所以 std::move(buffer) 将 return std::unique_ptr<std::vector<char>>> const&&,它匹配删除的 unique_ptr 复制构造函数 ,因此错误。

要修复错误,请使您的 lambda mutable,这将使 operator()()const,从而允许您移动构造 buffer

[ buffer = std::move( buffer ) ] ( ) mutable 
//                                   ^^^^^^^
{
   QueueMessage( std::move( buffer ) );
}