C++23 新特性详解:相较于 C++20 的主要改进

C++23 新特性详解:相较于 C++20 的主要改进

C++23 是 C++ 编程语言的最新标准版本(截至 2023 年),它在 C++20 的基础上引入了许多重要的新特性和改进。以下是 C++23 相较于 C++20 的主要变化:

一、语言核心特性改进

1. if consteval 语句

允许在编译时和运行时选择不同的代码路径

cpp 复制代码
constexpr int foo() {
    if consteval {  // C++23 新增
        return 42;  // 编译时执行
    } else {
        return runtime_value();  // 运行时执行
    }
}

2. 多维下标运算符

支持自定义多维数组的下标访问方式

cpp 复制代码
struct Matrix {
    int data[10][10];
    
    // C++23 允许这样定义
    int& operator[](size_t i, size_t j) { 
        return data[i][j];
    }
};

Matrix m;
m[2, 3] = 42;  // 多维下标访问

3. 静态运算符 operator[] 支持静态下标

cpp 复制代码
struct FixedString {
    constexpr char operator[](size_t N) const {
        return data[N];
    }
    const char* data;
};

constexpr FixedString fs{"hello"};
static_assert(fs[1] == 'e');  // C++23 支持

4. 放宽 constexpr 限制

  • 允许在 constexpr 函数中使用 typedefusing
  • 允许在 constexpr 函数中使用 dynamic_casttypeid
  • 允许在 constexpr 上下文中更灵活地使用 union

二、标准库增强

1. 新的标准库模块

cpp 复制代码
import std;  // C++23 标准库模块

2. <mdspan> 多维数组视图

cpp 复制代码
#include <mdspan>

int data[2 * 3 * 4] = {...};
std::mdspan mat(data, 2, 3, 4);  // 3D视图
int val = mat[1, 2, 3];  // 多维访问

3. <print> 格式化输出

cpp 复制代码
#include <print>

std::print("Hello {}!\n", "world");  // 类型安全、更快的输出
std::println("Value: {}", 42);       // 自动换行

4. 堆栈追踪库 <stacktrace>

cpp 复制代码
#include <stacktrace>

void foo() {
    auto trace = std::stacktrace::current();
    std::cout << std::to_string(trace) << '\n';
}

5. <expected> 错误处理

cpp 复制代码
#include <expected>

std::expected<int, std::string> parse_number(std::string_view s) {
    try {
        return std::stoi(std::string(s));
    } catch (...) {
        return std::unexpected("parse error");
    }
}

6. 范围(Ranges)增强

  • 新增 ranges::to 用于范围转换
  • 新增 ranges::fold 用于范围折叠操作
  • 更多范围适配器如 chunk_by, slide, join_with
cpp 复制代码
auto vec = std::views::iota(1, 6) | std::ranges::to<std::vector>();

三、并发编程改进

1. std::hive (原 plf::colony)

非连续容器,适合高频插入删除场景

cpp 复制代码
#include <hive>

std::hive<int> h;
auto it = h.insert(42);
h.erase(it);  // 不影响其他迭代器有效性

2. std::atomic 增强

  • std::atomic<float>std::atomic<double> 支持更多操作
  • 新增 std::atomic_ref 对非原子对象的原子操作
cpp 复制代码
float f = 3.14f;
std::atomic_ref af(f);
af.store(2.71f);

四、其他重要改进

1. 字符串格式化增强

cpp 复制代码
std::string s = std::format("{:m}", 1048576);  // 可能输出 "1 MiB"

2. 类型系统增强

  • std::is_scoped_enum 检测有作用域枚举
  • std::to_underlying 将枚举转换为基础类型
cpp 复制代码
enum class Color { Red, Green, Blue };
static_assert(std::is_scoped_enum_v<Color>);
int val = std::to_underlying(Color::Red);

3. 模块改进

  • 模块分区增强
  • 更好的模块与头文件互操作性

4. 协程增强

  • 协程工具类型如 std::coroutine_traits 改进
  • 协程调试支持更好

五、移除或弃用的特性

  1. 移除了 std::aligned_storagestd::aligned_union
  2. 弃用了 std::shared_ptrunique() 成员函数
  3. 移除了对一些旧 C 库函数的兼容支持

六、总结

C++23 在 C++20 的基础上主要带来了以下方面的改进:

  1. 语言核心 :更灵活的 constexpr、多维下标、静态运算符等
  2. 标准库 :新增 <mdspan>, <print>, <stacktrace> 等重要组件
  3. 并发std::hive 容器和原子操作增强
  4. 工具性:更好的格式化输出、错误处理和调试支持
  5. 现代化:进一步推动模块、范围和协程的使用

这些改进使 C++23 成为更强大、更安全、更易用的版本,特别是在高性能计算、系统编程和并发编程领域。

相关推荐
程与留1 小时前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt
程与留2 小时前
14_Qt 样式表(QSS)入门(语法、选择器、美化实战)
c++·qt
欧特克_Glodon11 小时前
OpenCV计算机视觉开发入门与实践<二十七>:图像分割概述
c++·人工智能·opencv·计算机视觉
蒸蒸yyyyzwd11 小时前
cpp 选手秋招学习笔记 day21
c++·面试·八股
Interview Aid11211 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
CoderIsArt19 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
AI情绪识别开源21 小时前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
「QT(C++)开发工程师」1 天前
C++ auto 用法详解
开发语言·c++
OPEN-F1 天前
C++STL教程:容器适配器与实用工具
开发语言·c++