c++ - unique_ptr,你引用了一个已删除的函数

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

我正在尝试移动 unique_ptrWriteAsync方法。这按预期工作。我现在遇到的问题是将唯一指针的所有权转移到 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
}

我看到的错误是:

you're referencing a deleted function

最佳答案

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 ) );
}

关于c++ - unique_ptr,你引用了一个已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51919473/

相关文章:

c++ - 将原始指针和智能指针的容器传递给模板函数

c++ - 提神气 : How to report parser warnings?

c++ - 怎么把QNetworkCookie转换成QString?

c++ - OpenSSL 在 x86 上编译失败,认为在 x86_64 上编译成功

c++ - 显示集合的第一个元素

c++ - constexpr 对匿名结构变量的引用

C++程序需要一个文件关联

c++ - 在 C++ 中创建节点的不同方式感到困惑?

c++ - 为什么 static_cast 可以编译将原始指针转换为智能指针

c++ - 为什么没有 unique_ptr::operator*() 的安全替代方案?