98

在最近的几次会议演讲中,我听到 Bjarne Stroustrup 和其他人提到了 C++ 的新编码指南以及一些支持它们的类型。

具体来说,我记得这个例子,span<T>而不是(T* p, int n)作为函数的参数(大约在 32:00 进入谈话时);但我也记得使用的建议array_view<T>。它们是两种选择但相同的概念吗?还是我混淆了事情,它们实际上并没有那么相关?

我似乎找不到任何关于它们应该是什么的权威定义。

4

3 回答 3

196

我们与标准委员会图书馆工作组的人员进行了交谈。他们希望他们试图进入的标准是只读的。对于核心指南,我们需要一个可读写的抽象。为了避免(潜在)标准和指南支持库(GSL)之间的冲突,我们将我们的(读写)重命名为:https ://github.com/microsoft/gsl 。array_viewarray_viewspan

于 2016-01-16T22:26:11.300 回答
48

CppCoreGuidlines中原来的array_view被重命名为span.

见:https ://github.com/isocpp/CppCoreGuidelines/pull/377

是这样描述的:

span 是使用指针访问数组的一种经过边界检查的安全替代方案

于 2016-01-16T21:57:02.563 回答
13

图书馆演进工作组(LEWG)的文档P0122R (2016-02-12 )正式将类型重命名
array_viewspan

变更日志

从 R0 的变化

  • 根据 LEWG 在 Kona 会议上的反馈,array_view将提议的类型名称更改为。span
  • [...]

我们还可以阅读:

对标准的影响

这个提议是一个纯粹的库扩展。它不需要对标准类、函数或标头进行任何更改。如果可以取决于P0257byte中提出的类型和对类型别名行为的更改,它将得到增强。

但是——如果采用的话——为这种新类型重载一些标准库函数可能很有用(一个例子是copy())。

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

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

元素类型和转换

span必须通过模板参数配置其元素类型ValueType,它必须是一个完整的对象类型,而不是抽象类类型。 span支持对其封装的序列的只读或可变访问。要访问只读数据,用户可以声明 a span<const T>,而对可变数据的访问将使用 a span<T>

[...]


另请参阅指南支持图书馆评论:span<T>来自 Marius Bancila(2016 年 3 月),定义span为:

指南支持库是标准 C++ 基金会 维护的C++ 核心指南中描述的一些类型和函数的 Microsoft实现。在 GSL 提供的类型中,以前称为.span<T>array_view<T>

span<T>是推荐使用的非拥有范围的连续内存,而不是指针(和大小计数器)或标准容器(例如std::vectorstd::array)。

于 2016-03-24T18:45:26.570 回答