出于某种原因,下面清单中的代码导致 clang++ 和 g++ 使用 100% CPU,并填满内存,直到我的系统挂起。
请注意,这是一个演讲的玩具示例。我知道accumulate
并且transform
是执行此操作的标准方法,但此代码是推理链中的中间点。
#include <iostream>
#include <range/v3/all.hpp>
using namespace ranges;
template <typename F, typename R, typename T>
T rec_map_sum(F f, R r, T tally) {
if (ranges::begin(r) == ranges::end(r))
return tally;
else {
auto r_head = *ranges::begin(r);
auto r_tail = r | view::drop(1);
return rec_map_sum(f, r_tail, tally + f(r_head));
// this also crashes:
// return rec_map_sum(f, r[{1, end}], tally + f(r_head));
}
}
int main() {
std::cout << rec_map_sum([](int x) { return x * x; }, view::iota(0, 10), 0)
<< std::endl;
return 0;
}
该rec_map_sum
函数旨在实现一个递归,该递归采用整数范围和一元函数,将函数元素应用于范围,并产生映射元素的总和。
我有两个问题:(1)不同行为的原因是什么,以及(2)我应该如何制作和传递尾部视图,以便编译不会崩溃?