【问题标题】:Is std::transform_reduce without execution policy portable?没有执行策略的 std::transform_reduce 是否可移植?
【发布时间】:2020-01-30 22:38:09
【问题描述】:

我可以在 Fedora 和 Ubuntu 上使用 gcc 9.2.1 编译以下代码(使用 std::transform_reduce),但尝试在 clang see godbolt 上编译失败,并且我收到报告说某些 FSF 版本的 gcc 9.2.1 也拒绝编译代码,要求std::execution_policy 作为std::transform_reduce 的第一个参数。

#include <vector>
#include <algorithm>
#include <numeric>

auto brokenvector(std::vector<int> const& a, std::vector<int> const& b) 
{
  return std::transform_reduce(cbegin(a), cend(a), cbegin(b), 0, std::plus<>{},std::multiplies<>{});
}

我特别不能在这里使用std::execution_policycppreference 和 C++ 草案标准文档 n4659 都显示重载没有执行策略。

我是否踏入了某种政治雷区,其中一半可用的编译器拒绝实施标准,或者代码不正确?

【问题讨论】:

  • C++17 是(相对)新的。如果答案很简单,我不会感到惊讶:一些库实现者还没有实现这个
  • 所以只要编译器/库遵守(完全实现)标准,它就可以移植。
  • @CássioRenan 这与我的问题正好相反,我明确不想指定执行策略。此外,虽然“C++17 尚未完全支持”的答案在 2017 年是完全合理的,但在 2020 年就不太容易理解了。我对 C++ 演变的理解是,目标是让大多数新功能已经在多个版本中实现标准化之前的编译器,对于我作为一个主要是 C 开发人员的我来说,std::algorithm 似乎是最近 c++ 标准的皇冠上的明珠。这让我感到莫名其妙。
  • @EOF 我知道。我认为您会认为这很有趣,因为它体现了您的问题:标准功能可能需要(有时很长时间)才能真正实现(如果您查看其中的一个 cmets,MSVC 花了 6 年多的时间才完成对 C 的支持++11!)

标签: c++


【解决方案1】:

这是一个 libstdc++ 与 libc++ 的问题。 libc++ 实现了the function,您可以在live example 中使用-stdlib=libc++ 在godbolt 上看到它与clang 一起使用。 gcc 现在在trunk 中实现了它,但当前发布的版本没有。该功能已添加到this commit

【讨论】:

  • @walnut 谢谢你。添加到答案中。
  • 非常感谢!有趣的是,Ubuntu 19.10 和 Fedora 31 显然都有已经包含此功能的 libstdc++ 版本。不管怎样,这个答案对我来说应该非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2011-06-15
  • 1970-01-01
  • 2017-03-11
相关资源
最近更新 更多