C++|编写现代C++代码:GSL 4.0.0 正式可用

C++|编写现代C++代码:GSL 4.0.0 正式可用

文章图片


大家过年好!
要搞明白什么是GSL , 需要先清楚 , 什么是C++ Core Guidelines 。
C++ Core Guidelines是一份简单的文档 , 里面描述了一组旨在编写现代C++代码的指导原则 。 这项工程由C++的原作者Bjarne Stroustrup发起并主导 , 主要聚焦在一些C++工程中出现的各种顶层设计问题 , 例如 , 接口设计 , 资源管理 , 内存管理和并发等 。 这些顶层设计会影响应用程序架构和库的设计 。 遵循这套指导原则 , 可以实现代码的静态类型安全(statically type-safe) , 规避潜在的资源泄漏问题 , 以及发现更多的代码逻辑错误 , 同时拥有更快的运行速度 。
而GSL(Guidelines Support Library)是由微软开发的 , C++ Core Guidelines指导原则的一个实现代码库 , 库中包含了C++ Core Guidelines里所建议的各种函数 , 类型等 。 整个代码库以各种头文件来实现 , 使用此代码库 , 需要使用支持C++ 14的编译器 。
好了 , 正文开始GSL的4.0.0版本已经正式可用 , 这次的版本包含了所有的安全编码规则 , 另外 , 我们还添加了一些额外的优化 。
有哪些变化?
> 废弃gsl::string_span
> 移除<gsl/multi_span>
> 头文件删除了 gsl_ 前缀
> 对not_null进行了修改
> gsl::span和std::span现已使用gsl::at的正确特化版本
> zstring系列不再要求使用空的尖括号 , 例如我们可以使用void foo(zstring str)来代替:void foo(zstring<> str)
> gsl::narrowing_error新增一个函数what() , 用以显示错误的详细信息
> finally和final_action现在被标记为[[nodiscard


> GSL将可以在禁用异常的环境中工作 , 但有一些警告
> 通过添加 GSL_NO_IOSTREAMS 标志 , GSL将在不支持iostream的环境中工作
> 更新了编译器支持
> CMake和构建优化
废弃gsl::string_span最新版的CppCoreGuidelines中删除了string_span 。 建议改用std::string_view , std::span或gsl::span 。 为了更紧密地使GSL与CppCoreGuidelines保持一致 , 我们弃用了string_span和zstring_span的实现 , 包括 basic_string_span、basic_zstring_span和所有相关类型 。目前 , 我们将继续保留 <gsl/string_span>头文件 , 但不会积极处理或维护它 。 可以在 README.md 中找到所有支持和不支持的类型/功能的列表 。
移除<gsl/multi_span>multi_span、strided_span和<gsl/multi_span>中的所有其他内容在一年前的GSL 3.0.0中已被弃用 , 现在是从库中删除它们及其相关测试的时候了 。
头文件删除了gsl_前缀以前在其名称中包含gsl_前缀的所有标头都已删除此前缀 。例如 , <gsl/gsl_algorithm>现在是<gsl/algorithm> 。gsl_前缀文件仍然存在并传递给更新的文件 , 但将在未来的版本中删除 。
对not_null进行了修改为了更紧密地使GSL与CppCoreGuidelines保持一致 , gsl::not_null现在只接受与 nullptr相当的类型 。以前 , 它只接受可从nullptr分配的类型 , 但这比CppCoreGuidelines的意图更严格 。
函数make_not_null和make_strict_not_null以及not_null比较运算符现在都是 noexcept 。
gsl::span和std::span现已使用gsl::at的正确特化版本gsl::span和std::span现在有自己独立的gsl::at特化 , 以确保两个版本的span之间的行为一致 。导入 <gsl/span> 时会引入两个重载版本 。std::span 重载可以与 <gsl/util> 分开包含 。
GSL将可以在禁用异常的环境中工作 , 但有一些警告gsl::narrow是库中唯一可能引发异常的部分 , 并且已移至其自己的头文件 <gsl/narrow> 中 。仅当启用异常时 , 此头文件才包含在 <gsl/gsl> 中 。这允许在环境中工作的库用户无一例外地使用库的所有其他组件 。