在 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。
给定以下层次结构:
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。