无法在 std::function<> 中传递 std::unique_ptr

Cannot pass std::unique_ptr in std::function<>

#include <functional>
#include <memory>
#include <string>
#include <iostream>

void foo(std::function<void()> f)
{
    f();
}

int main()
{
    std::unique_ptr<int> handle = std::make_unique<int>(5);
    foo(
        [h = std::move(handle)]() mutable
    {
        std::cout << *h << std::endl;
    });
}

以下代码编译错误

C:\Program Files (x86)\Microsoft Visual Studio19\Professional\VC\Tools\MSVC.28.29910\include\functional(914,58): error C2280: 'main::<lambda_1aa523ba59bbecea5306bc1fd178120f>::<lambda_1aa523ba59bbecea5306bc1fd178120f>(const main::<lambda_1aa523ba59bbecea5306bc1fd178120f> &)': attempting to reference a deleted function

  1. 为什么会这样?
  2. 有没有办法在 std::function 中传递 std::unique_ptr 而不是通过引用传递它?

std::function 要求函数对象是可复制构造的,因此您不能指望将 lamdba 移动到它。在初始化时,它会尝试复制 lambda 以及 std::unique_ptr ,它是此 lambda 的成员,但预计会失败。您可以做的是将您的 lambda 存储在一个变量中,并将其传递给使用 std::ref 接受 const std::function& 的函数,如下所示:

        void foo(const std::function<void()>& f); // function declaration
        auto a = [h = std::move(handle)]() mutable
        {
            std::cout << *h << std::endl;
        };
        foo(std::ref(a));

这是一个具有更详细答案的相关问题:How to create an std::function from a move-capturing lambda expression?