std::make_unique<std::thread> 与 lambda

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

我正在尝试在 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_uniquereturns一个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());