在 lambda 函数中移动 unique_ptr 在 C++17 上给我一个编译器错误

Moving unique_ptr inside a lambda function gives me a compiler error on C++17

给定以下层次结构:

class IJobInterface
{
};

class JobAbstract : public IJobInterface
{
public:
    JobAbstract(std::string n) : name(n) {};

protected:
    std::string name;
};

class JobConcrete: public JobAbstract
{
public: 
    JobConcrete(std::string n, int i) : JobAbstract(n), index(i) {};
    void doIt();

private:
    int index;
};

当我需要在 lambda 函数中将 JobConcrete 作为 unique_ptr 参数传递时:

void doSomenthigHeavy(std::unique_ptr<JobConcrete> j)
{
    j->doIt();
}

void main()
{
    auto job = std::make_unique<JobConcrete>("name", 0);
    doSomenthigHeavy(std::move(job)); //it works

    auto t = std::thread([j = std::move(job)]
    {
        doSomenthigHeavy(std::move(j)); //it doesn't work
    });
}

然后我得到一个编译器错误:

问题是:我在这里缺少什么? 从 lambda 内部调用 doSomenthigHeavy 会产生编译器错误,而从外部调用则不会。

问题是 lambda 的 operator () 被声明为 const 并且您尝试修改唯一指针 j.

通过 auto t = std::thread([j = std::move(job)]() mutable ...) 声明它可变或将 unique_ptr 作为参数传递给 lambda。