在最近的几次会议演讲中,我听说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>
。他们是两个选择,但概念相同吗?还是让我感到困惑,而它们实际上并没有那么相关?
我似乎找不到关于它们都应该有的权威定义。
array_view
已重命名为span
。
array_view
浮动。
Answers:
我们跟人说话的在库工作组在标准委员会。他们希望array_view
他们试图成为只读标准。对于核心准则,我们需要读写的抽象。为了避免(潜在)标准与准则支持库(GSL)之间发生冲突,我们将(读和写)重命名array_view
为span
:https : //github.com/microsoft/gsl。
const array_view<T>
加array view<const T>
不令人满意?
span
这样可以避免很多程序员犯傻错误。我认为,传达这些新变化的方式可能会更加清晰。我只是在想-使用常规的随机访问迭代器可以解决此问题吗?是否只是为了清楚起见添加了类型?
在CppCoreGuidlines中,原始名称array_view
已重命名为span
。
参见:https : //github.com/isocpp/CppCoreGuidelines/pull/377
因此描述如下:
span是使用指针访问数组的边界检查,安全的替代方法
图书馆发展工作组(LEWG)的文件P0122R(2016-02-12 )正式将类型重命名为:
array_view
span
变更日志
从R0开始的变化
- 该类型的更名被提出
array_view
来span
在科纳会议后从LEWG反馈。- [...]
我们还可以阅读:
对标准的影响
该建议是纯库扩展。它不需要对标准类,函数或标头进行任何更改。如果可能取决于P0257中
byte
建议的类型和类型别名行为的更改,它将得到增强。但是,(如果采用的话)为这种新类型重载一些标准库函数可能会很有用(例如
copy()
)。
span
已在标准C ++(C ++ 11)中实现,并已成功用于C ++代码的商业静态分析工具以及商业办公效率软件中。可从https://github.com/Microsoft/GSL获得开源的参考实现。
在下一章中,本文档介绍了只读和读写(可变)访问:
元素类型和转换
span
必须通过template参数配置其元素类型,该参数ValueType
必须是不是抽象类类型的完整对象类型。span
支持对其封装的序列的只读或可变访问。要访问只读数据,用户可以声明span<const T>
,而对可变数据的访问将使用span<T>
。[...]
另请参阅准则支持库评论:span<T>
Marius Bancila(2016年3月),定义span
为:
该准则支持库是一些在所描述的类型和功能的Microsoft实现C ++核心准则 保持在标准C ++基金会。在GSL提供的类型中,
span<T>
以前称为array_view<T>
。
span<T>
是连续内存的非所有范围,建议使用它代替指针(和大小计数器)或标准容器(例如std::vector
或std::array
)。