【问题标题】:Initilize a vector of std future at construction在构造时初始化一个标准未来向量
【发布时间】:2021-02-08 09:57:50
【问题描述】:

考虑以下代码:

#include <vector>
#include <future>

using namespace std;

void someFunction(){

  //do something
}

int main() {

  vector<future<void>> tasks1;

  tasks1.emplace_back(async(launch::async, someFunction));
  
  vector<future<void>> tasks2{ async(launch::async, someFunction) }; //doesn't compile

  vector<future<void>> tasks3{ move(async(launch::async, someFunction)) }; //doesn't compile

}

为什么 task2 和 task3 不能编译?我会假设在 tasks3 中调用了移动构造函数,但事实并非如此。

【问题讨论】:

    标签: c++ asynchronous vector future


    【解决方案1】:

    future不能复制,只能移动。

    { async(launch::async, someFunction) }
    

    future 存储在initializer_list 中。初始化器列表的所有元素都被认为是 const,referenceconst对象作为源对象只能复制到目标向量中,不能移动,所以代码编译失败。

    【讨论】:

    • 如果我在构造中使用move,initilizer_list不能存储右值并进行完美转发吗?
    • 尝试将initializer_list 的内容复制到vector 时(而不是在{} 中存储期货时),代码失败。然后进行复制,而不是移动操作 - {} 中的所有内容都被视为 const 对象。
    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2021-12-23
    • 2019-03-04
    相关资源
    最近更新 更多