引入
看看如下函数定义:
1 | DoSomething(char (&arr) [10]); // 10个元素的数组, sizeof(arr)==10*sizeof(char)==10 |
通常我们为了程序的复用性,会使用最后DoSomething(char *arr, size_t n);
的形式,通过传入字符指针和长度灵活处理。但可能出现以下情况:
1 | char str[10]; |
可能造成数组越界问题,如果需要解决这个问题,则需要进行如下繁琐操作:
1 | char str[10]; |
这里,引入std::span
,用于范围检查。cppreference
中对其的解释是类模板 span 所描述的对象能指代对象的相接序列,序列的首元素在零位置。 span 能拥有静态长度,该情况下序列中的元素数已知并编码于类型中,或拥有动态长度。典型实现只保有两个成员:指向 T 的指针和大小。
详解
std::span
是指向一组连续的对象的对象, 是一个视图view
, 不是一个拥有者owner
。
一组连续的对象可以是 C 数组, 带着大小的指针, std::array, 或者std::string。
std::span可以有两种范围:
- 静态范围
static extend
:编译期就可以确定大小; - 动态范围
dynamic extend
:由指向第一个对象的指针和连续对象的大小组成;
1 |
|
总结
无法确定长度的连续内存数组形参
都可以使用std::span
。