在最近的几次会议演讲中,我听到 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>
。它们是两种选择但相同的概念吗?还是我混淆了事情,它们实际上并没有那么相关?
我似乎找不到任何关于它们应该是什么的权威定义。
在CppCoreGuidlines中原来的array_view
被重命名为span
.
见:https ://github.com/isocpp/CppCoreGuidelines/pull/377
是这样描述的:
span 是使用指针访问数组的一种经过边界检查的安全替代方案
图书馆演进工作组(LEWG)的文档P0122R (2016-02-12 )正式将类型重命名为:
array_view
span
变更日志
从 R0 的变化
- 根据 LEWG 在 Kona 会议上的反馈,
array_view
将提议的类型名称更改为。span
- [...]
我们还可以阅读:
对标准的影响
这个提议是一个纯粹的库扩展。它不需要对标准类、函数或标头进行任何更改。如果可以取决于P0257
byte
中提出的类型和对类型别名行为的更改,它将得到增强。但是——如果采用的话——为这种新类型重载一些标准库函数可能很有用(一个例子是
copy()
)。
span
已在标准 C++ (C++11) 中实现,并已成功用于 C++ 代码的商业静态分析工具以及商业办公生产力软件。https://github.com/Microsoft/GSL提供了一个开源的参考实现。
在下一章中,本文档介绍了只读和读写(可变)访问:
元素类型和转换
span
必须通过模板参数配置其元素类型ValueType
,它必须是一个完整的对象类型,而不是抽象类类型。span
支持对其封装的序列的只读或可变访问。要访问只读数据,用户可以声明 aspan<const T>
,而对可变数据的访问将使用 aspan<T>
。[...]
另请参阅指南支持图书馆评论:span<T>
来自 Marius Bancila(2016 年 3 月),定义span
为:
指南支持库是标准 C++ 基金会 维护的C++ 核心指南中描述的一些类型和函数的 Microsoft实现。在 GSL 提供的类型中,以前称为.
span<T>
array_view<T>
span<T>
是推荐使用的非拥有范围的连续内存,而不是指针(和大小计数器)或标准容器(例如std::vector
或std::array
)。