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

时间:2016-01-16 21:01:40

标签: c++ cpp-core-guidelines guideline-support-library array-view

在最近的几次会议上,我听到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>的建议。它们是两个替代方案但是相同的概念吗?或者我是否混淆了事情,他们实际上并没有那么相关?

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

3 个答案:

答案 0 :(得分:167)

我们与library working group standards committee中的人进行了交谈。他们希望array_view他们试图进入标准只读。对于核心指南,我们需要一个读写的抽象。为避免(潜在)标准与指南支持库(GSL)之间发生冲突,我们将(读写)array_view重命名为spanhttps://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::vectorstd::array)。