C++ 中返回的 range-v3 对象的生命周期

gk2*_*gk2 4 c++ range lifetime 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; });
}
Run Code Online (Sandbox Code Playgroud)

并使用它,

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
}
Run Code Online (Sandbox Code Playgroud)

然而,结果告诉我一个虚拟值。我认为返回的范围对象的生命周期已经过期,并且我发现通过将它们制作为向量可以很好地传递结果。(这会导致构建向量的开销。)

有没有办法在没有过期寿命的情况下返回范围本身?

Qui*_*mby 5

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

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

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