在最近几个会议的演讲中,我听到了Bjarne Stroustrup和其他人提到了C++的新编码指南以及一些支持它们的类型。
具体来说,我记得他们举例使用span<T>
而不是(T* p, int n)
作为函数的参数(在谈话中大约32:00时);但我也记得建议使用array_view<T>
。它们是两种选择,但概念相同吗?还是我混淆了事情,它们实际上并不相关?
我似乎找不到任何权威的定义,说明它们都应该关注什么。
在最近几个会议的演讲中,我听到了Bjarne Stroustrup和其他人提到了C++的新编码指南以及一些支持它们的类型。
具体来说,我记得他们举例使用span<T>
而不是(T* p, int n)
作为函数的参数(在谈话中大约32:00时);但我也记得建议使用array_view<T>
。它们是两种选择,但概念相同吗?还是我混淆了事情,它们实际上并不相关?
我似乎找不到任何权威的定义,说明它们都应该关注什么。
array_view
设为只读。对于核心指南,我们需要一个可读写的抽象。为避免(潜在的)标准和指南支持库(GSL)之间的冲突,我们将我们的(可读写)array_view
重命名为span
:https://github.com/microsoft/gsl。const array_view<T>
再加上array_view<const T>
不够满意吗?” - einpoklumspan
可以帮助许多程序员避免犯傻瓜错误。不过,我认为这些新变化的沟通方式可以更清晰明了。我只是在想 - 这是否可以通过常规的随机访问迭代器来解决呢?这种类型是为了清晰而添加的吗? - Benjamin Gruenbaumarray_view
被重命名为span
。
span
是一种经过边界检查的安全替代方式,用于访问数组,而不是使用指针来访问。
来自图书馆演化工作组(LEWG)的文件P0122R(2016-02-12)正式将类型array_view
重命名为span
:
更改日志
与R0版本的区别
- 根据Kona会议上LEWG的反馈,将被提议的类型名称从
array_view
更改为span
。- [...]
我们还可以阅读:
此提案是一个纯库扩展,不需要对标准类、函数或头文件进行任何更改。如果可以依赖于P0257中提出的byte
类型和类型别名行为的更改,则会得到增强。
然而,如果被采纳,重载一些标准库函数以适应这个新类型可能会很有用(例如copy()
)。
span
已经在标准C++(C++11)中实现,并成功地用于C++代码的商业静态分析工具以及商业办公生产力软件中。开源的参考实现可在https://github.com/Microsoft/GSL上找到。
元素类型和转换
span
必须通过模板参数ValueType
配置其元素类型, 该类型必须是一个完整的对象类型,而不是抽象类类型。span
支持对其封装的序列进行只读或可变访问。 要访问只读数据,用户可以声明一个span<const T>
, 而访问可变数据则使用span<T>
。[...]
》
,将span
定义为:
指南支持库(GSL)是Microsoft实现C++核心准则中描述的一些类型和函数的库,由标准C++基金会维护。 GSL提供的类型之一是span<T>
,以前称为array_view<T>
。
span<T>
是一个非拥有的连续内存范围,建议使用它代替指针(和大小计数器)或标准容器(如std::vector
或std::array
)。
array_view
已经更名为span
。 - Galik