C++23
外观

C++23,正式名称ISO/IEC 14882:2024[1],是继C++20之后的C++编程语言开放标准。2020年2月,在布拉格举行的C++20最终会议上,通过了C++23的总体计划。[2][3]第一次针对C++23的WG21会议原定于2020年6月在瓦尔纳举行,但由于2019冠状病毒病疫情而被迫取消。[4][5]原定于2020年11月在纽约召开的会议也被取消。[6] 该标准于2023年2月由WG21在伊瑟阔举行的混合会议上从技术上最终确定。[7]
新的“Hello, world”示例
[编辑]C++23引入了一些新功能,新的Hello, world程序示例如下:
#include <print>
int main()
{
std::println("Hello, world!");
}
特性
[编辑]被接受纳入 C++23 的变更包括:
语言特性
[编辑]- 显式
this
对象参数[8] if consteval
[9]- 多维下标运算符[10]
- 静态调用运算符、静态下标运算符和静态 lambda[11][12]
- 简化隐式移动(implicit move)[13]
auto(x)
与auto{x}
初始化[14]- 新的预处理指令:
- 在基于范围的 for 循环中延长某些临时对象的生命周期[17]
- 新的标准属性
[[assume(expression)]]
[18] - 继承构造函数的类模板参数推导[19]
- 复合语句(compound statement)末尾的标签(label)[20]
- 初始化语句(init-statement)中允许别名声明(alias declaration)[21]
- 为
std::size_t
及其对应有符号类型添加字面量后缀[22] - 扩展浮点类型及其字面量(有条件支持)[23]
- 允许可选省略零参数 lambda 表达式中的
()
[24] - Lambda 表达式上的属性支持[25]
constexpr
相关改动:- 将
static_assert
和if constexpr
中的上下文收窄转换(contextual conversion)收窄到bool
[29] - 在行拼接(line splicing)之前修剪空白字符[30]
- 强制声明顺序决定内存布局[31]
- 分隔的转义序列(delimited escape sequences)[32]
- 命名的通用字符转义(named universal character escapes)[33]
- 文本编码相关变化:
标准库
[编辑]标准库模块支持
[编辑]协程库支持
[编辑]- 用于范围的同步协程
std::generator
[38]
通用工具支持
[编辑]- 结果类型
std::expected
[39] - 为
std::optional
[40] 和std::expected
[41] 添加单子操作 - 用于获取枚举底层值的工具函数
std::to_underlying
[42] - 仅可移动的可调用包装器
std::move_only_function
[43] std::forward_like
[44]std::invoke_r
[45]std::bind_back
[46]std::byteswap
[47]std::unreachable
:标记不可达代码的函数[48]- 使
std::tuple
与其他“类似元组”的对象兼容[49] - 为
std::reference_wrapper
提供std::basic_common_reference
特化以生成引用类型[50] - 为
std::pair
的转发构造函数添加默认参数[51]
编译时支持
[编辑]- 对以下内容添加
constexpr
支持: - 元编程工具:
- 为比较概念添加仅可移动类型支持[60]
注释
[编辑]- ^ ISO/IEC 14882:2024 Programming languages — C++. iso.org.
- ^ 2020 Prague Meeting Invitation and Information (PDF). [2020-09-08]. (原始内容存档 (PDF)于2019-12-29).
- ^ Author, Not Given. To boldly suggest an overall plan for C++23. www.open-std.org. 1968-01-01 [2020-09-08]. (原始内容存档于2020-05-23).
- ^ P2145R0: Evolving C++ Remotely. www.open-std.org. [2020-09-08]. (原始内容存档于2021-03-01).
- ^ Business Plan and Convener's Report: ISO/IEC JTC1/SC22/WG21 (C++) (PDF). [2020-09-08]. (原始内容 (PDF)存档于2021-10-23).
- ^ Upcoming Meetings, Past Meetings : Standard C++. isocpp.org. [2020-09-08]. (原始内容存档于2020-09-07).
- ^ C++23 "Pandemic Edition" is complete (Trip report: Winter ISO C++ standards meeting, Issaquah, WA, USA). herbsutter.com. 13 February 2023.
- ^ Gašper Ažman; Sy Brand; Ben Deane; Barry Revzin. Deducing this. 2021-07-12.
- ^ Barry Revzin; Richard Smith; Andrew Sutton; Daveed Vandevoorde. if consteval. 2021-03-22.
- ^ Mark Hoemmen; Daisy Hollman; Corentin Jabot; Isabella Muerte; Christian Trott. Multidimensional subscript operator (PDF). 2021-09-14.
- ^ static operator(). 2022-04-08.
- ^ static operator[] (PDF). 2022-11-11.
- ^ Simpler implicit move. 2022-03-23.
- ^ Zhihao Yuan. auto(x): decay-copy in the language. 2021-07-12.
- ^ Melanie Blower. Add support for preprocessing directives elifdef and elifndef (PDF). 2021-04-30.
- ^ Aaron Ballman. Support for #warning (PDF). 2022-01-13.
- ^ Wording for P2644R1 Fix for Range-based for Loop. 2022-11-11.
- ^ Portable assumptions (PDF). 2022-04-22.
- ^ Timur Doumler. Wording for class template argument deduction from inherited constructors (PDF). 2022-05-20.
- ^ Labels at the end of compound statements (C compatibility) (PDF). 2022-01-13.
- ^ Jens Maurer. Extend init-statement to allow alias-declaration. 2021-04-13.
- ^ JeanHeyd Meneide; Rein Halbersma. Literal Suffix for (signed) size_t. 2019-11-24.
- ^ Extended floating-point types and standard names. 2022-04-22.
- ^ Alex Christensen; JF Bastien. P1102R2: Down with ()!. 2020-12-11.
- ^ Attributes on Lambda-Expressions (PDF).
- ^ Ville Voutilainen. Non-literal variables (and labels and gotos) in constexpr functions. 2021-07-12.
- ^ Permitting
static constexpr
variables inconstexpr
functions. 2022-11-07. - ^ Relaxing some constexpr restrictions. 2022-01-27.
- ^ Andrzej Krzemieński. Narrowing contextual conversions to bool. 2021-04-12.
- ^ Corentin Jabot. Trimming whitespaces before line splicing (PDF). 2021-04-13.
- ^ Pal Balog. Make declaration order layout mandated (PDF). 2021-04-02.
- ^ Delimited escape sequences (PDF). 2022-02-25.
- ^ Named universal character escapes. 2022-03-25.
- ^ Support for UTF-8 as a portable source file encoding (PDF). 2022-07-01.
- ^ Corentin Jabot. Consistent character literal encoding (PDF). 2021-09-14.
- ^ Jens Maurer. Character sets and encodings. 2021-09-21.
- ^ Standard Library Modules std and std.compat (PDF).
- ^ (std::generator: Synchronous Coroutine Generator for Ranges) (PDF).
- ^ Vicente Botet; JF Bastien; Jonathan Wakely. std::expected. 2022-01-07.
- ^ Sy Brand. Monadic operations for std::optional. 2021-04-27.
- ^ Jeff Garland. P2505R5 Monadic Functions for
std::expected
. 2022-09-28. - ^ JeanHeyd Meneide. std::to_underlying for enumerations. 2021-01-22.
- ^ Matt Calabrese; Ryan McDougall. move_only_function. 2021-07-09.
- ^ Gašper Ažman. std::forward_like (PDF). 2022-05-13.
- ^ Zhihao Yuan. invoke_r. 2020-04-29.
- ^ 引用错误:没有为名为
range-adaptor
的参考文献提供内容 - ^ Isabella Muerte; Corentin Jabot. Byteswapping for fun&&nuf. 2021-09-17.
- ^ Melissa Mears; Jens Maurer. Function to mark unreachable code (PDF). 2021-10-15.
- ^ Corentin Jabot. Compatibility between tuple, pair and tuple-like objects (PDF). 2022-07-15.
- ^ Hui Xie; S. Levent Yilmaz; Tim Song. common_reference_t of reference_wrapper Should Be a Reference Type. 2023-02-07.
- ^ Wording for P2644R1 Fix for Range-based for Loop. 2022-11-11.
- ^ Peter Dimov. Making std::type_info::operator== constexpr. 2021-05-01.
- ^ Daniil Goncharov. A more constexpr bitset (PDF). 2022-06-25.
- ^ Andreas Fertig. Making std::unique_ptr constexpr (PDF). 2021-11-06.
- ^ Edward J. Rosten; Oliver J. Rosten. constexpr for <cmath> and <cstdlib> (PDF). 2021-11-12.
- ^ Daniil Goncharov; Alexander Karaev. Add Constexpr Modifiers to Functions to_chars and from_chars for Integral Types in <charconv> Header (PDF). 2021-09-18.
- ^ Juan Alday. A proposal for a type trait to detect scoped enumerations (PDF). 2020-10-12.
- ^ Timur Doumler; Vittorio Romeo. A trait for implicit lifetime types (PDF). 2022-11-11.
- ^ Tim Song. A type trait to detect reference binding to temporary. 2021-10-13.
- ^ Justin Bassett. Move-only types for equality_comparable_with, totally_ordered_with, and three_way_comparable_with (PDF). 2022-07-02.
另见
[编辑]![]() | 这是一篇關於電腦程式語言的小作品。您可以通过编辑或修订扩充其内容。 |