我一直在尝试使用c++17
的{{1}}算法。据说它应该支持std::reduce
支持的相同API,但是当在std::accumulate
和clang++-9.0
中用gcc-9.2
进行编译时,对--std=c++17
的调用会成功编译,而对std::accumulate
的呼叫没有。
到目前为止,我尝试了几件事:
std::reduce
lambda
语法明确指定类型std::reduce<...>
上出现错误以下是使用#include <execution>
和std::reduce
对std::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
答案 0 :(得分:1)
实际上,reduce
和accumulate
之间的区别之一是执行策略支持。如果不需要执行策略,可以致电accumulate
。因此,带有std::execution::seq
的代码可以通过gcc-trunk
成功编译:https://godbolt.org/z/ERxU_q
答案 1 :(得分:0)
正如@Vittorio Romeo所说,这可能是libstc++
中的错误或尚未实现的功能,可以通过使用libc++
切换到-libstd=libc++
来使用它< / p>