使用 MSVC2012,
以下代码将按预期编译和运行
std::packaged_task< int() > task( []()->int{ std::cout << "hello world" << std::endl; return 0; } );
std::thread t( std::move(task) );
t.join();
而以下代码将无法编译和运行
std::packaged_task< void() > task( [](){ std::cout << "hello world" << std::endl; } );
std::thread t( std::move(task) );
t.join();
为什么会这样?
编辑:作为一种解决方法,可以使用 std::promise 在返回 void 的函数上获取 std::future
std::promise<void> promise;
auto future = promise.get_future();
std::thread thread( [](std::promise<void> &p){ std::cout << "hello world" << std::endl; p.set_value(); }, std::move(promise) );
future.wait();
请注意,在带有 std::thread 的 vs2012 库中存在一个错误,该错误会强制您将承诺作为左值引用传入并将承诺移入,如果您通过值或通过 r- 传递承诺,它将无法编译价值参考。这可能是因为实现使用了 std::bind() ,它的行为不符合预期。