C++23,正式名称ISO/IEC 14882:2024,是继C++20之后的C++编程语言开放标准。2020年2月,在捷克布拉格举行的C++20最终会议上,通过了C++23的总体计划。第一次针对C++23的WG21会议原定于2020年6月在保加利亚瓦尔纳举行,但由于2019冠状病毒病疫情而被迫取消。 原定于2020年11月在美国纽约召开的会议也被取消。 该标准于2023年2月由WG21在美国伊瑟阔举行的混合会议上从技术上最终确定。
新的“Hello, world”示例
C++23引入了一些新功能,使用新的标准库头文件列印出Hello, world的程序示例如下:
#include
int main()
{
std::println("Hello, world!");
}
特性
被接受纳入 C++23 的变更包括:
语言特性
- 显式 this 对象参数
*if consteval
- 多维下标运算符
- 静态调用运算符、静态下标运算符和静态 lambda
- 简化隐式移动(implicit move)
*auto(x) 与 auto{x} 初始化
- 新的预处理指令:
**#elifdef 与 #elifndef
**#warning
- 在基于范围的 for 循环中延长某些临时对象的生命周期
- 新的标准属性 assume(expression)
- 继承构造函数的类模板参数推导
- 复合语句(compound statement)末尾的标签(label)
- 初始化语句(init-statement)中允许别名声明(alias declaration)
- 为 std::size_t 及其对应有符号类型添加字面量后缀
- 扩展浮点类型及其字面量(有条件支持)
- 允许可选省略零参数 lambda 表达式中的 ()
- Lambda 表达式上的属性支持
*constexpr 相关改动:
** 在 constexpr 函数中允许非字面量变量、标签(label)与 goto 语句
** 允许在 constexpr 函数中使用 static 和 thread_local 变量(只要可用于常量表达式)
**constexpr 函数不再要求返回类型与参数类型是字面量类型
** 现在可以编写即使没有任何调用符合核心常量表达式要求的 constexpr 函数
- 将 static_assert 和 if constexpr 中的上下文收窄转换(contextual conversion)收窄到 bool
- 在行拼接(line splicing)之前修剪空白字符
- 强制声明顺序决定内存布局
- 分隔的转义序列(delimited escape sequences)
- 命名的通用字符转义(named universal character escapes)
- 文本编码相关变化:
** 支持将 UTF-8 作为可移植的源文件编码
** 字符字面量编码一致性
** 字符集与编码相关说明
标准库
标准库模块支持
*标准库 模块 std 和 std.compat
协程库支持
*用于范围的同步协程 std::generator
通用工具支持
*结果类型 std::expected
*为 std::optional 和 std::expected 添加单子操作
*用于获取枚举底层值的工具函数 std::to_underlying
*仅可移动的可调用包装器 std::move_only_function
*std::forward_like
*std::invoke_r
*std::bind_back
*std::unreachable:标记不可达代码的函数
*使 std::tuple 与其他“类似元组”的对象兼容
*为 std::reference_wrapper 提供 std::basic_common_reference 特化以生成引用类型
*为 std::pair 的转发构造函数添加默认参数
编译时支持
*对以下内容添加 constexpr 支持:
**std::type_info::operator==
**std::bitset
**std::unique_ptr
**部分 函数
**std::to_chars 和 std::from_chars 的整型重载
*元编程工具:
**类型特性 std::is_scoped_enum、std::is_implicit_lifetime、std::reference_constructs_from_temporary 和 std::reference_converts_from_temporary
*为比较概念添加仅可移动类型支持
注释
另见
*C++
*C++20
*C++17
*C++14
*C++11
评论 (0)