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