You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

探讨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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:52:07