无法编译std :: reduce调用,而std :: accumulate调用则根据相同的参数进行编译

时间:2019-10-18 00:20:04

标签: c++ stl c++17

我一直在尝试使用c++17的{​​{1}}算法。据说它应该支持std::reduce支持的相同API,但是当在std::accumulateclang++-9.0中用gcc-9.2进行编译时,对--std=c++17的调用会成功编译,而对std::accumulate的呼叫没有。

到目前为止,我尝试了几件事:

  • 在通话内外定义std::reduce
  • 使用lambda语法明确指定类型
  • 将重载与执行策略参数一起使用
    • std::reduce<...>上出现错误

以下是使用#include <execution>std::reducestd::accumulate中的字符串长度求和的示例代码:

std::vector

在调用#include <iostream> #include <vector> #include <string> #include <algorithm> #include <numeric> int main() { auto op = [](auto acc, auto val) { return acc + val.size(); }; std::vector<std::string> v = {"a", "bb", "ccc", "dddd"}; int a = std::reduce(v.begin(), v.end(), 0, op); int b = std::accumulate(v.begin(), v.end(), 0, op); return 0; } 并从std::reduce获得以下输出的行中,编译失败:

clang-9.0.0

<source>:12:13: error: no matching function for call to 'reduce' int a = std::reduce(v.begin(), v.end(), 0, op); ^~~~~~~~~~~ /opt/compiler-explorer/gcc-9.2.0/lib/gcc/x86_64-linux-gnu/9.2.0/../../../../include/c++/9.2.0/pstl/glue_numeric_defs.h:26:1: note: candidate template ignored: deduced conflicting types for parameter '_ForwardIterator' ('__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char> *, std::vector<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > > >' vs. 'int') reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init); ^ /opt/compiler-explorer/gcc-9.2.0/lib/gcc/x86_64-linux-gnu/9.2.0/../../../../include/c++/9.2.0/pstl/glue_numeric_defs.h:21:1: note: candidate function template not viable: requires 5 arguments, but 4 were provided reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init, ^ /opt/compiler-explorer/gcc-9.2.0/lib/gcc/x86_64-linux-gnu/9.2.0/../../../../include/c++/9.2.0/pstl/glue_numeric_defs.h:31:1: note: candidate function template not viable: requires 3 arguments, but 4 were provided reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last); ^ 1 error generated. 的以下输出:

gcc-9.2

2 个答案:

答案 0 :(得分:1)

实际上,reduceaccumulate之间的区别之一是执行策略支持。如果不需要执行策略,可以致电accumulate。因此,带有std::execution::seq的代码可以通过gcc-trunk成功编译:https://godbolt.org/z/ERxU_q

答案 1 :(得分:0)

正如@Vittorio Romeo所说,这可能是libstc++中的错误或尚未实现的功能,可以通过使用libc++切换到-libstd=libc++来使用它< / p>