gpt4 book ai didi

c++ - range的递归函数(from range-v3)导致编译发散: why?

转载 作者:太空狗 更新时间:2023-10-29 21:34:56 24 4
gpt4 key购买 nike

出于某种原因,下面 list 中的代码导致 clang++ 和 g++ 使用 100% CPU,并填满内存,直到我的系统挂起。

请注意,这是一个用于演讲的玩具示例。我知道 accumulatetransform 是执行此操作的标准方法,但此代码是推理链中的中间点。

#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) 我应该如何制作和传递尾 View 以使编译不会崩溃?

最佳答案

Jarod42 指出了这个问题,但解决方案非常简单。您需要一个可以采用任何范围的类型删除 View 。幸运的是,such a thing exists .将您的代码更改为:

template <typename F, typename R, typename T>
T rec_map_sum(F f, R r, T tally) {
auto r2 = any_view<T>{r};
if (ranges::begin(r2) == ranges::end(r2))
return tally;
else {
auto r_head = *ranges::begin(r2);
auto r_tail = r2 | view::drop(1);
return rec_map_sum(f, r_tail, tally + f(r_head));
}
}

这会打印出 285。

关于c++ - range的递归函数(from range-v3)导致编译发散: why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44683591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com