我正在尝试将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
}
我看到的错误是:
您引用的是已删除的功能
答案 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 ) );
}