WBu*_*uck 1 c++ unique-ptr c++14
我正试图移动unique_ptr到WriteAsync方法.这按预期工作.我现在遇到的问题是将唯一指针的所有权移入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)
我看到的错误是:
您正在引用已删除的功能
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)