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中提出的bytetypes和types混叠行为的改变,则会得到增强。

但是,如果采用这种方式,可能会为这种新types重载一些标准库函数(例如copy() )。

span已经在标准的C ++(C ++ 11)中实现,并正在被成功地用于C ++代码的商业静态分析工具以及商业办公生产力软件。 https://github.com/Microsoft/GSL提供了一个开源的参考实现。;

在下一章中,这些文档介绍了只读读写可变 )访问:

元素types和转换

span必须通过模板参数ValueTypeconfiguration其元素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::vectorstd::array )。

Interesting Posts