gsl库中的span和array_view有什么区别?
在最近的几次会议演讲中,我听说Bjarne Stroustrup和其他人提到了C ++的新编码准则以及支持它们的一些types。
具体来说,我记得span<T>
(T* p, int n)
的例子,而不是(T* p, int n)
作为函数的参数 (大约在32:00进入通话)。 但我也记得使用array_view<T>
的build议。 他们是两个select,但同一个概念? 还是我混淆了事实,而他们其实并没有那么相关?
我似乎无法find他们应该是什么的权威定义。
我们和标准委员会的图书馆工作组的人讨论过。 他们想要array_view
他们试图进入标准只能读取。 对于核心准则,我们需要一个读取和写入的抽象。 为了避免(潜在)标准与指导方针支持库(GSL)之间的冲突,我们将(读写) array_view
更名为https://github.com/microsoft/gsl 。
在CppCoreGuidlines中原来的array_view
被重命名为span
。
请参阅: https : //github.com/isocpp/CppCoreGuidelines/pull/377
这样描述:
span是使用指针访问数组的边界检查,安全的替代方法
来自图书馆演进工作组 (LEWG)的文件P0122R (2016-02-12)
正式将typesarray_view
重命名为span
:
更新日志
从R0的变化
- 改变了从
array_view
提出的types的名称,以便在科纳会议上遵循LEWG的反馈意见。- […]
我们也可以阅读:
对标准的影响
这个build议是一个纯粹的库扩展。 它不需要对标准类,函数或标题进行任何更改。 如果可能取决于P0257中提出的
byte
types和types混叠行为的改变,则会得到增强。但是,如果采用这种方式,可能会为这种新types重载一些标准库函数(例如
copy()
)。
span
已经在标准的C ++(C ++ 11)中实现,并正在被成功地用于C ++代码的商业静态分析工具以及商业办公生产力软件。 https://github.com/Microsoft/GSL提供了一个开源的参考实现。;
在下一章中,这些文档介绍了只读和读写 ( 可变 )访问:
元素types和转换
span
必须通过模板参数ValueType
configuration其元素types,该模板参数必须是不是抽象类types的完整对象types。span
支持对其封装的序列进行只读或可变访问。 要访问只读数据,用户可以声明一个span<const T>
,并且访问可变数据将使用span<T>
。[…]
另见指南支持图书馆评论: Marius Bancila(2016年3月)的span<T>
将span
定义为:
指南支持库是Microsoft 标准C ++基础维护的C ++核心指南中描述的一些types和function的实现。 GSL提供的types是
span<T>
以前称为array_view<T>
。
span<T>
是一个非拥有的连续内存范围,build议使用而不是指针(和大小计数器)或标准容器(如std::vector
或std::array
)。