1

我有一个程序可以计算不同线程中的一些值std::packaged_task<int()>。我将std::future通过打包任务获得的信息存储get_future()在一个向量中(定义为std::vector<std::future<int>>)。

当我计算所有任务的总和时,我使用了一个 for 循环并且它正在工作:

// set up of the tasks
std::vector<std::future<int>> results;
// store the futures in results
// each task execute in its own thread

int sum{ 0 };
for (auto i = 0; i < results.size; ++i) {
    sum += results[i].get();
}

但我宁愿使用基于范围的 for 循环:

// set up of the tasks
std::vector<std::future<int>> results;
// store the futures in results
// each task execute in its own thread

int sum{ 0 };
for (const auto& result : results) {
    sum += result.get();
}

目前我收到一个编译错误与clang:

program.cxx:83:16: error: 'this' argument to member function 'get' has type 'const std::function<int>', but function is not marked const

       sum += result.get();
              ^~~~~~
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/future:793:7: note: 'get' declared here

       get()
       ^

是否可以将基于范围的 for 循环vectorof一起使用future<int>

4

2 回答 2

5

您需要删除constfrom for (const auto& result : results)std::future不提供get编译器试图调用的 const 限定版本,因为它是对resulta 的引用const std::future

for (auto& result : results) {
    sum += result.get();
}

做你想做的。

于 2019-06-26T21:41:01.517 回答
4

getis not const,所以你需要非常量引用:

for (auto& result : results) {
    sum += result.get();
}
于 2019-06-26T21:40:32.193 回答