使用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();
请注意,vs2012 库中的 std::thread 存在一个错误,它强制您将 Promise 作为左值引用传递并将 Promise 移入,如果您按值或通过 r- 传递 Promise,则不会编译。价值参考。据推测,这是因为实现使用了 std::bind() ,它的行为不符合预期。
这是MSVC2012 中的一个错误。 MSVC2012 附带的线程库实现中存在相当多的错误。我在博客文章中发布了部分列表,将其与我的商业 Just::Thread 库进行比较:http://www.justsoftwaresolutions.co.uk/news/just-thread-v1.8.0-released.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)