探讨borrowed_range与view的关系:所有borrowed_range都是view吗?
C++ borrowed_range 相关问题解答
前提说明
已知并非所有view都是borrowed_range,例如transform_view就不属于borrowed_range。
问题1:是否所有borrowed_range都属于view?
不是。borrowed_range的核心定义是:该range的迭代器不会因为range对象本身被销毁或移动而悬垂。只要满足这个条件的range都可以是borrowed_range,比如:
- 原生数组(如
int arr[10]) std::array<T, N>std::span<T>
但其中原生数组、std::array并不属于view——view是C++20中定义的轻量、可组合的range适配器,需要满足额外的概念约束(比如默认构造、可移动赋值、无状态或轻量状态等),而borrowed_range没有这些要求。
问题2:由于borrowed_range复制成本较低,是否意味着可以安全地获取其元素的引用?
这种说法不准确。borrowed_range的核心特性是迭代器的有效性与range对象自身的生命周期无关,和复制成本没有直接联系:
- 有些
borrowed_range复制成本确实低(比如std::span,本质是指针+长度,复制是O(1)操作);但原生数组无法被复制,只能退化为指针,显然不存在“复制成本”的说法。 - 能否安全获取元素引用的关键,是元素本身的生命周期要长于引用的生命周期。
borrowed_range保证的是:即使range对象被销毁,指向元素的迭代器/引用仍然有效(因为元素存储在range对象外部),但前提是元素的原始存储(比如原容器、数组)没有被销毁。这和range对象的复制成本完全无关。
内容的提问来源于stack exchange,提问作者dwto
相关产品推荐
相关产品推荐

