C++23 新标准发布:有哪些变化以及如何影响开发
C++ 国际标准化委员会 (ISO/IEC JTC1/SC22/WG21) 已正式批准该语言的新版本——C++23。此版本不像 C++11 或 C++20 那样具有根本性变革,但包含了许多期待已久的改进,将使代码更安全、更具表现力且性能更高。我们来分析每位 C++ 开发者必须了解的关键新特性。
C++23 的主要变化
- Deducing this (P0847R7) —— 最受期待的新特性。现在可以显式指定调用方法的对象,从而简化了左值/右值、常量版本和非常量版本的重载,并消除了 CRTP 模板中的代码重复。
- std::expected (P0323R12) —— 一种无需异常的错误处理类型,是 std::optional 和异常的替代方案。它允许返回值或错误,这对于对性能有严格要求的系统至关重要。
- std 模块 (P2465R3) —— 标准库现在通过模块导出,从而加快编译速度并改善代码隔离。例如,
import std;可以替代数十个#include。 - 协程改进 —— 新增了用于惰性序列的
std::generator类型,并修复了 C++20 协程中许多与性能和人体工程学相关的问题。 - 多线程 —— 用于线程同步的新机制
std::latch和std::barrier,以及改进的std::counting_semaphore。
这对开发者意味着什么?
C++23 不会破坏向后兼容性,但引入了新的实践。例如,deducing this 简化了库的编写,而 std::expected 将逐步取代繁琐的返回码检查。许多编译器(GCC 13+、Clang 16+、MSVC 2022 17.6+)已经支持部分功能。
对于从事高负载系统工作的人来说,模块(构建速度提升 20-40%)和无需异常的错误处理改进尤其重要。如果您正在使用 C++20,迁移到 C++23 无需重写代码——只需启用新的编译标志即可。
何时能获得完整支持?
C++23 的完整支持预计在 2024 年底前在编译器中实现。目前可以使用 -std=c++2b (GCC/Clang) 或 /std:c++latest (MSVC) 标志来测试个别特性。我们建议从 std::expected 和 deducing this 开始——它们在实际项目中最有用。
您可以在编译器文档中找到最新的代码示例以及与 C++20 的对比。C++23 是一个渐进式的进步,使语言更安全、更方便,同时不牺牲性能。