c++ - 您可以从 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?
解决方案
推荐阅读
- python - '包含' numpy 库?
- javascript - 在 PHP 中的时间范围内执行操作
- java - 如何通过 Api Gateway 自动生成的 Java SDK 使用 cognito 持久性未经身份验证的凭据?
- azure - 微软翻译语音缺少标点符号
- node.js - 为什么我的代理句不能正常工作?
- javascript - 引导模式联系表单提交不起作用
- python - 制作 Django Rest Framework (DRF) 工作流的方法
- vue.js - 在 Vue 路由解析之前访问 Vuex
- r - 手动将图例添加到 ggplot2
- networking - 如何使用 neo4j algo.pageRank 计算子图的 pagerank