C++ 如何 std::accumulate future vector ?

标签 c++ concurrency future

为什么下面的代码不能编译?

#include <future>
#include <numeric>
#include <vector>

int main() {
    const std::vector<int> values{1, 2, 3, 4, 5};
    auto futures = std::accumulate(
        begin(values), end(values), std::vector<std::future<int>>{},
        [](auto accumulator, auto value) {
            accumulator.push_back(
                async(std::launch::async, [value] { return value; }));
            return accumulator;
        });
}

https://cpp.godbolt.org/z/c967ra1hY

有趣的是,使用 cppreference 中的accumulate 实现作品https://cpp.godbolt.org/z/MdM8Wh3Eq .

最佳答案

这是 std::accumulate 规范中的缺陷。该算法被指定为将累加器重复复制到 binary_op 参数中。这是changed C++20 中的重复移动。因此,与旧标准相比,C++20 中的标准库实现表现出不同的行为,如您所见 here (来自第 31 行)在 MSVC 的示例中。

这就是在 C++20 之前破坏代码的原因,因为 std::futurestd::vector 是不可复制的。因此添加编译器开关/std:c++20。如果您坚持使用较旧的标准,那么您可能会不走运,即使这并不是您的错。

关于C++ 如何 std::accumulate future vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75635355/

相关文章:

C++::vector of vector in `struct` 作为另一个 vector 的数据类型

java - 线程安全的全局内存计数器,每 x 递增一次刷新到 mysql

java - 如何在没有种族的情况下测试 Future 是否完整?

scala - 你如何处理 Akka Flow 中的 future ?

flutter - 从Flutter中的另一个屏幕调用Future函数

c++ - 在 C++ 中初始化结构体中数组的正确方法

java - Eclipse 上的 Android 原生 c++ - 在 stdlib 上给出错误,但可以工作

c++ - 如果有 std::barrier,为什么还要 std::latch?

c++ - std::future 是否旋转等待?

c++ - 无法使用合格枚举作为参数将类实例化为 LHS 值 (C++ VS2015)