2020年6月4日–GSL 3.1.0版已经发布。请看最新的 发布页面 有关GSL 3.1.0的信息。有关将来的所有更新,请参阅 发布页面 在GitHub上。
微软3.0.0版的 C++核心指南支持库 (GSL)现在可供您在 发布页面 . 微软的 gsl::span
在C++ 20标准的跨标准化中起到了关键作用,但是,标准没有为内存边界安全提供任何运行时检查保证。边界安全由 gsl::span
在防止微软产品出现安全问题方面非常成功。这个版本维护了我们一直提供的安全保证,但是实现了我们的实现,使之与C++ 20跨对齐。
这个版本有什么变化?
- 的新实现
gsl::span
和gsl::span_iterator
这符合C++ 20标准。 - 违反合同行为的变更。
- 额外的CMake支持。
- 反对
gsl::multi_span
和gsl::strided_span
.
何时应该使用gsl::span而不是std::span?
默认情况下,使用 std:: span
哪一个 在VS2019 16.6中发货 ( 在16.7中对接口进行了额外的修改, 请参阅发行说明 ) 如果启用了C++ 20模式,不需要运行时边界检查保证 . 使用 gsl ::span
如果你需要支持 s C++中C++的20以下(C++) gsl ::span
支持C++ 14和 更高)或 运行时边界检查保证(a) 在上执行的所有操作 gsl ::span
它的迭代器有明确的边界安全检查。 )
gsl::跨度
随着span的标准化接近完成,我们决定是时候让我们的实现与标准中的设计更改保持一致了。新的实现提供了完全边界检查,如果底层数据有效,就可以保证边界安全。
一般变更
gsl::span
已重写以使其接口与 std::span
. 最大的变化是span的范围现在没有签名。现在实施为 std::size_t
以前是这样的 std::ptrdiff_t.
推而广之, dynamic_extent
现在定义为 static_cast<std::size_t>(-1)
而不仅仅是 -1
.
- 田野
span::index_type
已删除,替换为span::size_type
. - 增加了类模板参数推导(CTAD)支持。
接口对齐
这些是对齐所需的更改 gsl::span
到的接口 std::span
.
删除的函数
-
span::operator()
-
span::at
-
span::cbegin
-
span::cend
-
span::crbegin
-
span::crend
新增功能
-
span::front
-
span::back
重命名的函数
-
span::as_writeable_bytes
已重命名为span::as_writable_bytes
gsl::spanu迭代器
一般变更
我们执行 span_iterator
已经完全重写为更像范围。以前,实现由一个跨度指针和一个偏移量组成。新的实现由三个指针组成:begin、end和current。
新实施的好处
新的实现可以自己执行所有边界检查,而不是调用span。通过依赖指向底层数据的指针,而不是指向范围的指针,新的 span_iterator
能活过潜在的跨度。
新的标题
创建
元素从移动并插入到
- 跨度比较运算符
-
gsl::make_span
- 跨专业化
gsl::at
-
gsl::begin
-
gsl::rbegin
-
gsl::crbegin
-
gsl::end
-
gsl::rend
-
gsl::crend
违反合同
合同违规不再可配置。违反合同总是导致终止,而不是提供一个编译时选项来抛出或忽略违反合同的行为。这可能会在将来发生变化。对这一决定提出了一些关切,对话继续进行: CPPCore指南#1561 . 顺便说一句,删除抛出行为需要将我们的测试基础结构从Catch2迁移到googletest,googletest对死亡测试的支持很容易实现对违反契约行为的测试。
CMake改进
此版本现在支持 find_package
. 一旦安装,使用 find_package(Microsoft.GSL CONFIG)
轻松消耗GSL。
多跨度和跨步跨度的弃用
为了更紧密地将微软的GSL与C++核心指南相一致,我们决定不执行我们的 gsl::multi_span
和 gsl::strided_span
. 目前,我们将继续提供这些标题,但除非C++核心指南标识它们的需要,否则它们将不被积极地工作或维护。
改进 改变 s c 奥辛 p 电位 b 建造 b 收割 和 米 关税
更改: 已签名的更改 std::ptrdiff_t
到未签名 std::size_t
在里面 gsl::span
可能导致有符号/无符号不匹配。
缓解措施: 使用 static_cast
或 gsl::narrow_cast
解决不匹配。
更改: gsl::multi_span
和 gsl::strided_span
已经被否决了。
缓解措施: 将多维数组作为常量引用而不是 gsl::multi_span
.
更改: 利用 移动 跨度 帮手 功能 威尔g 生成编译器错误。 这些函数的示例包括跨度比较运算符, gsl::make_span
等等。
缓解措施: 在使用这些函数的文件中包含
更改: 删除违反合同行为。
缓解措施: 在执行终止以进行调试之前,请使用终止处理程序记录相关信息。依靠投掷行为并不能保证安全。
即将进行的更改
报纸 P1976R2页 21世纪布拉格工作组会议的成果尚未在GSL中得到落实。将此添加到GSL时将发布次要版本。
我们期待您的反馈。如果您想联系我们,请使用下面的评论或电子邮件 visualcpp@microsoft.com . 访问我们的网页 github 如果您想提交问题或对项目作出贡献。
更新历史记录
2020年4月23日–发布GSL版本3.0.1
2020年6月4日–发布GSL版本3.1.0