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 小时前
HTMLCollection 对象
开发语言
浔川python社1 小时前
C++ 之父中国行・40 周年城市站 —— 北京 & 上海开发者见面日报名链接暂不对外开放公告
c++
froginwe111 小时前
Ruby 日期 & 时间处理指南
开发语言
Evand J1 小时前
【MATLAB例程】二维指纹对目标的一段轨迹定位,锚点数量可调。输出位置真值、估计值对比,附代码下载链接
开发语言·数据库·matlab
wjs20241 小时前
SQL NOW() 函数详解
开发语言
缘三水1 小时前
【C语言】13.指针(3)
c语言·开发语言·指针·语法
Doris8931 小时前
【JS】JS进阶--作用域、函数、解构赋值、数组方法
开发语言·前端·javascript
山峰哥1 小时前
现代 C++ 的炼金术:铸就高性能与高可维护性的工程实践
java·开发语言·前端·数据结构·c++
小尧嵌入式2 小时前
QT软件开发知识流程及秒表计时器开发
开发语言·c++·qt·算法