gsl库中span和array_view的区别是什么?

ein*_*ica 85 c++ array-view cpp-core-guidelines guideline-support-library

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

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

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

Bja*_*rup 174

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

  • 并且`const array_view <T>`加上`数组视图<const T>`不满意? (37认同)
  • 这是关于资源和悬空指针的讨论.跨度和GSL是一个侧面问题.看看Neil MacIntosh的CppCon 2015演讲:"不断发展的array_view和string_view以获取安全的C++代码"https://www.youtube.com/watch?v=C4Z3c4Sv52U和/或查看GSL源代码:https:// github.com/microsoft/gsl.我们还在制定正式(标准样式)规范. (5认同)
  • 有人担心"视图"暗示只是查看内容而不是修改它们,所以有些人想要读/写版本的不同后缀.我认为没有人关心现有的只读array_view类型.这是string_view,人们在默认情况下只读它是只读的. (4认同)

Gal*_*lik 42

CppCoreGuidlines中将原始文件array_view重命名为span.

请参阅:https://github.com/isocpp/CppCoreGuidelines/pull/377

因此描述如下:

span是使用指针访问数组的边界检查,安全的替代方法

  • @einpoklum不,我明白了.我可能也选择了Bjarne Stroustrup.不(嗅)取(嗅)它(嗅)个人(wahhhhhh)...... (27认同)
  • 那条评论让我感受到了内心的某种东西,所以我也+1 ;-) (3认同)
  • 我给你+1了,但是Bjarne Stroustrup(真的?)的答案更加详细. (2认同)

oli*_*bre 11

来自图书馆演变工作组(LEWG)的文件P0122R(2016-02-12 )正式将类型重命名:
array_viewspan

更新日志

从R0的变化

  • 在Kona会议上将LEWG 提供的类型名称更改array_viewspan以下反馈.
  • [...]

我们还可以阅读:

对标准的影响

此提议是纯库扩展.它不需要对标准类,函数或标头进行任何更改.如果可能取决于P0257中byte提出的类型别名行为的类型和更改,它将得到增强.

但是 - 如果采用 - 为这种新类型重载某些标准库函数可能很有用(例如copy()).

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

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

元素类型和转换

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

[...]


另见指南支持库评论:span<T>来自Marius Bancila(2016年3月)定义span为:

准则支持库是微软实现的一些中所描述的类型和功能的C++核心原则 由维持标准C++基金会.GSL提供的类型span<T>之前称为array_view<T>.

span<T>是一个非拥有的连续内存范围,建议用于代替指针(和大小计数器)或标准容器(如std::vectorstd::array).