GSL 3.0.0版本

2020年6月4日–GSL 3.1.0版已经发布。请看最新的 发布页面 有关GSL 3.1.0的信息。有关将来的所有更新,请参阅 发布页面 在GitHub上。

null

微软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 能活过潜在的跨度。

新的标题

创建标头是为了支持依赖于旧span实现的部分的客户,而这些部分在span的标准定义中不再存在。

元素从移动并插入到

  • 跨度比较运算符
  • 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

© 版权声明
THE END
喜欢就支持一下吧,技术咨询可以联系QQ407933975
点赞0 分享