unique_ptr,您引用的是已删除的函数

时间:2018-08-19 16:04:19

标签: c++ c++14 unique-ptr

我正在尝试将unique_ptr移至WriteAsync方法。这按预期工作。我现在遇到的问题是将唯一指针的所有权移到strand.post lambda中,然后再次将其移到QueueMessage中。 QueueMessage需要一个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
}

我看到的错误是:

  

您引用的是已删除的功能

1 个答案:

答案 0 :(得分:7)

lambda的函数调用运算符是const成员函数。因此,std::move(buffer)将返回std::unique_ptr<std::vector<char>>> const&&,它与已删除的unique_ptr复制构造函数instead of its move constructor相匹配,因此会出错。

要解决该错误,请将您的lambda mutable设为operator()()const,允许您移动结构buffer

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