我对C ++中期货/承诺的行为感到有点困惑。
代码如下
std::future<std::string> method() {
std::promise<std::string> pr;
std::future<std::string> ft = pr.get_future();
std::thread t(
[](std::promise<std::string> p)
{
p.set_value("z");
},
std::move(pr)
);
t.detach();
return std::move(ft);
}
当我运行代码时,__throw_future_error((int)future_errc::no_state);
std::future<std::string> ft = pr.get_future();
知道为什么会这样吗?
编辑:
所以,我有一个展示问题的最小例子。 Coliru(使用g ++ 4.8和更新的stdlib)似乎运行得很好,但是当它涉及到我的工作站时它会失败。
http://coliru.stacked-crooked.com/a/711e182594cbe7d3
我正在编译
# gcc 4.7.3
g++ -g -std=c++11 -lpthread t.cpp -o t
和
# clang 3.2.1
clang++ -g -std=c++11 -lpthread t.cpp -o t
libstdc ++版本是3.4.17
Workstation是Linux Mint 15
答案 0 :(得分:1)
这看起来像个错误。指定promise
的默认构造函数来构造promise
的共享状态。从future
返回的pr.get_future()
应该引用该共享状态。
-stdlib=libc++
是您的选择吗?