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

WBu*_*uck 1 c++ unique-ptr c++14

我正试图移动unique_ptrWriteAsync方法.这按预期工作.我现在遇到的问题是将唯一指针的所有权移入strand.postlambda,然后再将其移动到QueueMessage. QueueMessage需要一个std::unique_ptr<std::vector<char>>.

在这种情况下,对我来说简单的方法就是使用a shared_ptr.我想知道是否有办法在不使用a的情况下完成这项工作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
}
Run Code Online (Sandbox Code Playgroud)

我看到的错误是:

您正在引用已删除的功能

Pra*_*ian 7

lambda的函数调用运算符是const成员函数.所以std::move(buffer)将返回std::unique_ptr<std::vector<char>>> const&&,它匹配已删除的unique_ptr复制构造函数而不是其移动构造函数,因此错误.

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

[ buffer = std::move( buffer ) ] ( ) mutable 
//                                   ^^^^^^^
{
   QueueMessage( std::move( buffer ) );
}
Run Code Online (Sandbox Code Playgroud)