C++23 发布:新标准关键变化概览
编程语言世界迎来了一项里程碑事件——C++ 国际标准化委员会 (ISO/IEC JTC1/SC22/WG21) 正式批准了该语言的新版本:C++23。这个接替 C++20 的版本并非革命性更新,但包含了许多期待已久且实用的改进,将使代码更简洁、更安全、性能更高。让我们来剖析最重要的新特性。
C++23 的主要新特性
1. std::print 和 std::println —— cout 的现代替代方案
这可能是日常编程中最显著的变化。标准库新增了基于 std::format (C++20) 强大格式化功能的 std::print 和 std::println 函数。现在,控制台输出不仅更方便,而且比使用 std::cout 快得多。
- 示例:
std::println("你好,{}!答案是:{}", name, 42); - 优势: 类型安全、语法可读性强、支持 Unicode。
2. deducing this (P0847R7) —— 显式指定 this
这是元编程和库创建中最强大的新特性之一。现在可以将对象 this 作为成员函数的参数显式传递。这解决了 lambda 和 CRTP (奇异递归模板模式) 的旧有问题。
- 允许编写一个同时适用于 const 和非 const 对象的成员函数。
- 简化了“按限定符重载”模式的实现。
3. 多维 operator[] (P2128R6)
一项期待已久的功能——现在 operator[] 可以接受多个参数。这对于处理多维数组的库(例如 mdspan 或自定义矩阵)至关重要。
- 以前:
matrix(2, 3)或matrix[{2,3}] - 现在:
matrix[2, 3]—— 自然且简洁。
4. std::expected —— 函数式错误处理
异常和返回码的替代方案。std::expected<T, E> 类型要么包含一个有效值,要么包含一个错误。这在禁止使用异常的系统(嵌入式系统、操作系统内核)中尤其有价值。
5. 模块和概念的改进
模块 (C++20) 得到了修复和稳定。现在它们得到了编译器更好的支持。概念变得更加灵活,新增了在概念参数中使用 auto 的能力。
还有哪些值得注意的?
std::mdspan—— 用于处理数组的多维 span。std::ranges的修复 —— API 的稳定化和空白填补。[[assume]]属性 —— 向编译器提供优化提示。- 静态
operator()调用 —— 可能性