C++ 将boost::future与continuations和boost::when_all一起使用

C++ 将boost::future与continuations和boost::when_all一起使用,c++,c++11,boost,future,continuations,C++,C++11,Boost,Future,Continuations,我想将boost::future与continuations和boost::when_all/boost::when_any一起使用 boosttrunk(而不是1.55)包含了后者的实现(以该提案为模型,即将用于C++14/17和boost1.56) 是我拥有的(而且它没有编译): #包括 #定义BOOST\u线程\u提供未来 #定义BOOST\u线程\u提供\u未来\u延续 #定义BOOST\u线程\u提供\u未来\u何时\u所有\u何时\u任何 #包括 使用名称空间boost; int m

我想将
boost::future
与continuations和
boost::when_all
/
boost::when_any
一起使用

boosttrunk(而不是1.55)包含了后者的实现(以该提案为模型,即将用于C++14/17和boost1.56)

是我拥有的(而且它没有编译):

#包括
#定义BOOST\u线程\u提供未来
#定义BOOST\u线程\u提供\u未来\u延续
#定义BOOST\u线程\u提供\u未来\u何时\u所有\u何时\u任何
#包括
使用名称空间boost;
int main(){
future f1=async([](){return 1;});
future f2=async([](){return 2;});
自动f3=当全部(f1,f2)时;
f3.然后([](decltype(f3)){

std::cout问题是
when\u all
只能通过右值
future
shared\u future
调用

或者一开始就避免给它们命名:

auto f = when_all(async([]{return 1;}),
                  async([]{return 2;}));
此外,您必须
获取
返回的未来,然后
而不是中间未来:

auto done = f.then([](decltype(f)) {
  std::cout << "done" << std::endl;
});

done.get();

我认为您需要
获取
返回的
未来
,而不是
f3
,即
自动f4=f3。然后(…);f4.get();
没有帮助:(
when_all
如果我正确阅读了找到的源代码,就会使用迭代器。您没有使用迭代器。您是否尝试将未来放在一个向量中,并调用
when_all(vec.begin(),vec.end())
?与此完全相同的问题(“调用已删除的构造函数”),至少还有链接的建议(论文)提到了两个重载版本的
when\u all
。一个使用位置参数,另一个使用迭代器。有同样的问题,因为
std::vector
列表中的
std::initializer\u list
构造函数正在尝试复制未来。我唯一想知道的是为什么我可以移动未来两次。请参阅链接到右侧的代码ve.它将
f2
移动到
when_all
导致
f12
,第二次移动到
when_all
导致
f23
。您能解释一下为什么允许这样做/这样做吗?多谢了!@oberstet从对象移动的对象不是无效的,它处于“有效但未指定的状态”您可以重复地从对象中移动,但这样做的结果是由实现定义的。@oberstet对上述内容进行了轻微更正,这通常适用于标准库对象,除非另有规定:从30.6.6[futures.unique\u future]/3开始对未定义
valid()==false
future
对象调用析构函数、移动赋值运算符或
valid
以外的任何成员函数的效果。“非常感谢!这是无价的……我们为此奋斗了两个小时。@奥伯斯特修正了答案:我对解决方案的看法是正确的,但对问题的看法并不完全正确。
template <typename... T> 
see below when_all(T&&... futures); 
auto f3 = when_all(std::move(f1), std::move(f2));
auto f = when_all(async([]{return 1;}),
                  async([]{return 2;}));
auto done = f.then([](decltype(f)) {
  std::cout << "done" << std::endl;
});

done.get();
when_all(
  async([]{return 1;}),
  async([]{return 2;})
).then([](auto&) {
  std::cout << "done" << std::endl;
}).get();