在最近的几次会议上,我听到Bjarne Stroustrup和其他人提到了C ++的新编码指南以及支持它们的一些类型。
具体来说,我记得the example of span<T>
instead of (T* p, int n)
as a parameter to a function(在谈话时间大约32:00);但我也记得使用array_view<T>
的建议。它们是两个替代方案但是相同的概念吗?或者我是否混淆了事情,他们实际上并没有那么相关?
我似乎无法找到任何关于它们应该是什么的权威定义。
答案 0 :(得分:167)
我们与library working group standards committee中的人进行了交谈。他们希望array_view
他们试图进入标准只读。对于核心指南,我们需要一个读写的抽象。为避免(潜在)标准与指南支持库(GSL)之间发生冲突,我们将(读写)array_view
重命名为span
:https://github.com/microsoft/gsl。
答案 1 :(得分:42)
在CppCoreGuidlines原始array_view
已重命名为span
。
请参阅:https://github.com/isocpp/CppCoreGuidelines/pull/377
由此描述:
span是使用指针访问数组的边界检查,安全的替代方法
答案 2 :(得分:11)
来自图书馆演变工作组(LEWG)的文件P0122R(2016-02-12)
正式将类型array_view
重命名为span
:
更新日志
从R0
的变化
- 根据LEWG在Kona会议上的反馈,将建议的类型名称从
array_view
更改为span
。- [...]
我们也可以阅读:
对标准的影响
此提案是纯库扩展。 它不需要对标准类,函数或标头进行任何更改。 如果可能取决于
byte
类型,它将得到增强 并更改为P0257中建议的类型别名行为。然而 - 如果采用 - 为这种新类型重载一些标准库函数可能是有用的(例如
copy()
)。
span
已在标准C ++(C ++ 11)中实现,并且正在成功实施 用于C ++代码的商业静态分析工具以及商业办公生产力软件。 https://github.com/Microsoft/GSL提供了一个开源参考实现。
在下一章中,本文档介绍了只读和读写( mutable )访问:
元素类型和转换
必须使用其元素类型配置
span
通过模板参数ValueType
, 这是一个完整的对象类型 这不是抽象类类型。span
支持对其封装的序列进行只读或可变访问。 要访问只读数据,用户可以声明span<const T>
, 访问可变数据将使用span<T>
。[...]
另请参阅Marius Bancila的Guidelines Support Library Review: span<T>
(2016年3月),将span
定义为:
Guidelines Support Library是Microsoft的实现 C++ Core Guidelines中描述的一些类型和功能 由Standard C++ Foundation维护。 GSL提供的类型之一是
span<T>
,以前称为array_view<T>
。
span<T>
是一个非拥有的连续内存范围,建议用来代替 指针(和大小计数器)或标准容器(例如std::vector
或std::array
)。