关于C++中右值范围如何转为owning_view的技术问询
你的理解完全正确
- 函数1和函数2能正常运行的核心逻辑:当视图操作的是右值范围(临时对象或
std::move()标记的对象)时,C++20的范围组合机制会自动将该右值范围包装为std::ranges::owning_view,让视图直接持有这个被移动过来的范围对象,而非仅保存引用。这确实和返回值优化(RVO)无关——哪怕RVO失效,owning_view依然会通过移动语义接管原范围的资源。- 函数1里的
std::vector{1,2,3,4,5}是临时右值,和views::drop组合后,返回的视图内部会用owning_view持有被移动后的vector,返回后可安全使用。 - 函数2里的
std::move(col)把局部vector转为右值引用,同样触发owning_view的创建,视图会移动接管col的元素资源,原局部col变为可析构的空状态,返回的视图持有有效资源。
- 函数1里的
- 函数3报错的原因:直接返回
col | views::drop(2)时,视图保存的是对局部vectorcol的引用。函数返回后col被销毁,视图就成了悬垂引用,访问时会触发未定义行为。
附参考代码:
#include <iostream> #include <vector> #include <ranges> auto getValues1() { return std::vector{ 1, 2, 3, 4, 5 } | std::views::drop(2); // OK } auto getValues2() { std::vector col{ 1, 2, 3, 4, 5 } ; return std::move(col) | std::views::drop(2); // OK } auto getValues3() { std::vector col{ 1, 2, 3, 4, 5 }; return col | std::views::drop(2); // ERROR: return reference to local range } int main() { auto res1 = getValues1(); auto res2 = getValues2(); auto res3 = getValues3(); }
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

