

新闻资讯
技术学院std::span 是 C++20 引入的轻量级非拥有式数组视图,仅持指针和长度,用于安全高效传递连续内存片段,避免拷贝与裸指针误用,支持编译期/运行期边界约束,但不管理内存生命周期。
std::span 是 C++20 引入的轻量级非拥有式数组视图,它不管理内存,只持有指向连续元素的指针和长度,用于安全、高效地传递数组或容器片段,避免不必要的拷贝和裸指针误用。
span 可由原生数组、std::array、std::vector(或其他支持 data() + size() 的容器)构造,类型推导通常自动完成:
span 在编译期(固定大小)或运行期(动态大小)提供越界防护(仅在启用调试断言如 _ITERATOR_DEBUG_LEVEL=2 或使用 at() 时);更重要的是,它明确表达“我只读/写这一段”,并阻止隐式降维或越界切片:
s.subspan(2, 3) 安全获取子视图,超出范围会截断或返回空 span(不抛异常)s.first(3) 和 s.last(2) 分别取前 N 个、后 N 个元素,同样做范围约束std::span,传入 5 元素数组会编译失败——强制匹配尺寸把 span 当作首选参数
类型,能提升接口清晰度和安全性:
process(arr)、process(v)、process(v.subspan(1, 4)),无需手动传 sizespan 本身不延长所指对象生命周期,使用时需确保源数据存活时间 ≥ span 生命周期:
return std::span{local_arr}; → 悬垂视图std::span{std::vector{1,2,3}} → vector 析构后 span 失效span)保证不修改元素,但不阻止底层 const T 被修改(若原始指针非常量)std::ranges 使用)