c++中返回的range-v3对象的生存期



我想做一个像np.arange()一样工作的函数。对于range-v3,代码是

auto arange(double start, double end, double step){
assert(step != 0);
const auto element_count = static_cast<int>((end - start) / step) + 1;
return ranges::views::iota(0, element_count) | ranges::views::transform([&](auto i){ return start + step * i; });
}

auto range = arange(1, 5, 0.5);
for (double x : range){
std::cout << x << ' '; // expect 1 1.5 2 2.5 3 3.5 4 4.5 5
}

然而,结果告诉我一个假值。我认为返回的范围对象的生命周期已经过期,我发现把它们变成向量可以很好地传递结果。(这将导致构造vector的开销)

是否有任何方法返回范围本身而没有过期的生命周期?

由于[&]捕获局部变量,您成为未定义行为的受害者。

如果您捕获值[start, step](auto i){ return start + step * i; },代码将正常工作。

请注意,视图总是非拥有的,可以复制,并且通常在其存储中为0(1)。由于iota是一个生成视图并将其完整状态存储在自己内部,因此代码是安全的。

最新更新