C 17 功能
C 17 为该语言引入了大量新功能,显着扩展了其功能并增强了其可用性。这些新增内容涵盖了语言的各个方面,从模板改进和 lambda 增强到库添加和弃用元素。
语言功能
模板和通用代码:
-
类的模板参数推导模板: 构造函数现在可以推导模板参数,类似于函数。
-
;模板参数: 表示任何非类型模板参数类型的值。
-
修订非类型模板参数: 对非类型模板进行了一些修复和修订
Lambda:
-
Constexpr Lambda: 如果 Lambda 满足某些要求,现在可以显式标记为 constexpr .
-
捕捉这个Lambda 函数: Lambda 函数现在可以捕获 this 指针,从而允许访问成员变量和方法。
属性:
-
新属性: 属性,例如 [[fallthrough]]、[[nodiscard]] 和引入 [[maybe_unused]] 是为了增强代码的清晰度和可读性。
-
命名空间和枚举器上的属性: 现在可以使用 [[attributes]] 将属性应用于命名空间和枚举器。
语法清理:
-
内联变量:现在可以内联声明变量,允许编译器内联其定义。
-
简化的命名空间声明: 引入了命名空间 A::B 语法以简化命名空间声明。
-
简化的 static_assert: 现在可以在没有字符串参数的情况下使用 static_assert 语句。
干净的多重返回和流程控制:
-
结构化绑定: 结构化绑定可以更方便地在声明中解包元组和其他数据结构。
-
带初始化的条件语句: if (init; condition) 和 switch (init;condition) 在条件语句中提供了更大的灵活性。
-
通用化基于范围的 For 循环:基于范围的 for 循环现在支持不同于以下的标记(结束迭代器):开始迭代器。
-
if constexpr: if constexpr 允许基于条件编译关于编译时常量。
其他:
-
十六进制浮点文字:浮点文字现在可以以十六进制格式表示。
-
过度对齐数据的动态内存分配:改进了对过度对齐的动态内存分配的支持数据。
-
保证复制消除:某些不保证复制消除的场景现在有了明确的保证。
-
改进的评估顺序:某些表达式的求值顺序规则已被修改,以便更清晰
库添加
数据类型:
-
std::variant: 多态可以保存多个替代值之一的值的类型类型。
-
std::可选: 表示可能包含或不包含值的可选值。
-
std::any: A可以保存任意值的类型擦除容器type.
-
std::string_view: 对字符序列的引用,类似于 const char*。
-
std::byte: A表示原始类型bytes.
实用程序:
-
std::invoke: 使用给定参数调用可调用函数,支持各种类型可调用对象。
-
std::apply: 解压元组并将其元素作为参数传递给可调用对象。
-
std::invoke_result 和相关概念: 用于确定给定调用可调用对象的有效性和结果的概念和类型参数。
文件系统库 (TS v1):
新算法:
- for_each_n
- reduce
- transform_reduce
- exclusive_scan
- inclusive_scan
- transform_exclusive_scan
- transform_inclusive_scan
线程:
-
std::shared_mutex:一种共享互斥锁,允许多个读取者但只允许一个写入者。
-
atomic::is_always_lockfree: 指示原子类型是否在所有情况下都是无锁的。
-
scoped_lock:: 锁定多个互斥体同时简化锁定和解锁。
(部分)库基础知识库(TS v1):
容器改进:
-
try_emplace 和 insert_or_assign:改进了处理特定场景的容器插入方法。
-
容器拼接:高效之间移动节点
智能指针更改:
- 修复和调整 std::unique_ptr 和其他智能指针。
额外改进:
-
可简单复制的 std::reference_wrapper: 提高了某些情况下的性能。
-
更新了 C11 库: C 17 标准库基于 C11 ,提供与现代的兼容性系统。
-
已弃用的元素: 先前版本的 C 标准中的各种元素已被弃用。
C 1z 中的功能(预计适用于 C 17)* *
确定 C 1z 工作草案中的哪些功能将在 C 17 中可用编译器,建议查阅各个编译器的文档和发行说明。并非 C 1z 的所有功能都一定会在每个 C 17 编译器中实现。
请注意,本摘要中并未提及所有更改或功能。如需完整列表,请参阅 C 17 标准文档或其他信誉良好的来源。
以上是C 17 中引入了哪些关键语言功能、库添加和已弃用的元素?的详细内容。更多信息请关注PHP中文网其他相关文章!