std::make_unique<std::thread> with lambda

std::make_unique<std::thread> with lambda

本文关键字:std gt with lambda thread make lt unique      更新时间:2023-10-16

我正在尝试在Visual Studio 2013上编译以下代码:

std::unique_ptr<std::thread> threadPtr;
threadPtr.reset(std::make_unique<std::thread>([&]
{
  //...
}));

失败并显示错误:

error C2664: 'void std::unique_ptr<std::thread,std::default_delete<_Ty>>::
    reset(std::thread *) throw()' : cannot convert argument 1 from 
    'std::unique_ptr<std::thread,std::default_delete<_Ty>>' to 'std::thread *'

这似乎很奇怪,因为我在其他地方使用std::make_unique没有问题。但是,当我不使用std::make_unique而是使用new时,它可以工作:

std::unique_ptr<std::thread> threadPtr;
threadPtr.reset(new std::thread([&]
{
  //...
}));

我在这里做错了什么,还是编译器问题?

>std::make_unique返回一个std::unique_ptr。但std::unique_ptr::reset期待一个指针。因此,您要查找的是:

std::unique_ptr<std::thread> threadPtr(std::make_unique<std::thread>([&]
{
  //...
}));

或:

threadPtr.reset(std::make_unique<std::thread>([&]
{
  //...
}).release());