首页 > 解决方案 > 您可以从 std::transform_reduce 中的变换步骤修改临时中间值吗?

问题描述

修改std::transform_reduce中的临时中间值是UB吗?

假设我想并行合并列表并重用一些内存。我可以尝试使用 std::transform_reduce :

#include <list>
#include <vector>
#include <numeric>
#include <execution>
#include <iostream>

using namespace std;

list<int> list_merge(const vector<list<int>> &lists)
{
    auto merge_binary_op = [](auto &&list1, auto &&list2)
    {
        list1.splice(list1.end(), list2);
        return std::move(list1);
    };
    auto copy_list_unary_op = [](const list<int> &list_to_copy)
    {
        return list_to_copy;
    };

    return transform_reduce(execution::par, lists.begin(), lists.end(), list<int>{}, merge_binary_op, copy_list_unary_op);
}

int main()
{
    auto lists = vector<list<int>>{{1}, {2, 3}, {4, 5, 6}};
    for (auto &el : list_merge(lists))
        cout << el << ' ';
    cout << endl;
}

https://godbolt.org/z/r44vfM978

该标准似乎只禁止修改初始值。但是,std::reduce 有效地禁止了修改其参数的二进制操作。我想知道这是否是我所做的 UB,因为它似乎违背了 Parallelism TS 的精神。标准作者能否将措辞从 std::reduce 复制到 std::transform_reduce?

标签: c++parallel-processingstlc++17

解决方案


推荐阅读