跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

C++26 核心功能详解:特性、语法与示例代码

C++26 是继 C++23 后的新一代标准,处于委员会草案阶段。核心特性包括模式匹配替代传统分支逻辑、静态反射实现编译期元信息获取、语言级支持 128 位整数及 constexpr 扩展。标准库方面,std::generator 正式标准化,Ranges 库新增 enumerate 等视图,std::expected 增强错误处理。安全特性引入 std::safe_cast 和智能指针边界检查。提供各特性的语法解释及可运行示例代码。

清心发布于 2026/3/30更新于 2026/9/1074 浏览

C++26 核心功能详解:特性、语法与示例代码

C++26 是继 C++23 之后的新一代标准,延续了'每三年一个版本'的发布周期,截至 2025 年处于委员会草案(CD)阶段,大部分核心特性已基本确定。其核心目标是提升易用性、完善现代编程范式(如模式匹配、静态反射)、优化性能与安全,并弥补前序版本的功能缺口。

本文将从核心语言特性、标准库改进、性能与安全特性三个维度,详细介绍 C++26 的关键功能,并附带语法解释和可运行的示例代码。


一、核心语言特性

1. 模式匹配(Pattern Matching)
功能介绍

模式匹配是 C++26 最具里程碑意义的特性(源于 P2508R4),旨在替代传统的 if/switch、dynamic_cast 等繁琐的条件分支逻辑,支持值匹配、类型匹配、解构绑定等场景,大幅提升代码的可读性和可维护性。

核心语法元素

语法元素

作用

match (表达式)

模式匹配的入口,替代多分支 if 和 switch

case 模式

定义匹配的模式及处理逻辑

_

通配符模式,匹配任意值

var x

绑定模式,将匹配的值绑定到变量 x

a...b

范围模式,匹配闭区间 [a, b] 内的值

Type{var x, var y}

解构模式,分解聚合类型/类的成员

示例代码
(1)值模式与范围匹配
#include <iostream>
int main() {
    int score = 85;
    // 模式匹配:值与范围匹配
    match (score) {
        case 100: std::cout << "满分!" << std::endl; break;
        case 90...99: // 匹配 90-99 的整数
            std::cout << "优秀" << std::endl; break;
        case 80...89:
            std::cout << "良好" << std::endl; break;
        case 60...79:
            std::cout << "及格" << std::endl; break;
        case _:
            // 匹配所有其他情况
            std::cout << "不及格" << std::endl; break;
    }
    return 0;
}
(2)类型模式与多态匹配
#include <iostream>
#include <memory>
// 基类
struct Shape {
    virtual ~Shape() = default;
};
// 派生类
struct Circle : Shape {
    double radius;
    Circle(double r) : radius(r) {}
};
struct Rectangle : Shape {
    double w, h;
    Rectangle(double w, double h) : w(w), h(h) {}
};
// 计算面积:替代 dynamic_cast
double area(const std::unique_ptr<Shape>& shape) {
    match (shape) {
        case std::unique_ptr<Circle> var c:
            return 3.14159 * c->radius * c->radius;
        case std::unique_ptr<Rectangle> var r:
            return r->w * r->h;
        case nullptr:
            // 空指针模式
            return 0.0;
        case _:
            throw std::runtime_error("未知形状");
    }
}
int main() {
    auto circle = std::make_unique<Circle>(5.0);
    auto rect = std::make_unique<Rectangle>(4.0, 5.0);
    std::cout << "圆面积:" << area(circle) << std::endl; // 78.53975
    std::cout << "矩形面积:" << area(rect) << std::endl; // 20
    return 0;
}
(3)解构模式(分解聚合类型)
#include <iostream>
#include <tuple>
struct Point {
    int x, y;
};
// 为 Point 启用解构(C++26 自动支持公共成员的解构)
int main() {
    Point p{3, 5};
    std::tuple<std::string, int> t{"C++26", 2026};
    // 解构 Point
    match (p) {
        case Point{var x, var y}:
            std::cout << "Point(" << x << ", " << y << ")" << std::endl; // Point(3, 5)
            break;
    }
    // 解构 tuple
    match (t) {
        case std::tuple{var s, var year}:
            std::cout << s << " 发布于 " << year << std::endl; // C++26 发布于 2026
            break;
    }
    return 0;
}

2. 静态反射(Static Reflection)
功能介绍

静态反射是 C++ 社区长期期待的特性,C++26 基于 P2320R7 实现了基础的编译时反射能力,允许程序在编译期获取类型的元信息(如成员名称、类型、修饰符),并基于这些信息自动生成代码(如序列化、ORM 等)。

核心语法

语法/函数

作用

reflexpr(T)

获取类型 T 的反射元对象(std::reflect::type)

std::reflect::name_of(meta)

获取元对象的名称(编译期字符串)

std::reflect::data_members_of(meta)

获取类的所有数据成员元对象

std::reflect::for_each(meta, func)

编译期遍历元对象列表

示例代码(编译期生成对象打印函数)
#include <iostream>
#include <reflect> // C++26 新增头文件
#include <string_view>
struct Person {
    std::string name;
    int age;
    double height;
};
// 编译期生成通用打印函数
template <typename T>
void print_object(const T& obj) {
    // 获取 T 的反射元对象
    constexpr auto type_meta = reflexpr(T);
    // 获取 T 的所有数据成员
    constexpr auto members = std::reflect::data_members_of(type_meta);
    std::cout << typeid(T).name() << " { ";
    // 编译期遍历成员
    std::reflect::for_each(members, [&](auto member_meta) {
        // 获取成员名称(编译期字符串)
        constexpr std::string_view name = std::reflect::name_of(member_meta);
        // 获取成员的值
        auto&& value = std::reflect::get(member_meta, obj);
        std::cout << name << ": " << value << ", ";
    });
    std::cout << "\b\b }" << std::endl;
}
int main() {
    Person p{"张三", 25, 175.5};
    print_object(p); // 输出:Person { name: 张三,age: 25, height: 175.5 }
    return 0;
}

3. 128 位整数的语言级支持(P2216R3)
功能介绍

C++23 及之前,128 位整数(__int128)是编译器扩展(GCC/Clang 支持),C++26 将**有符号 128 位整数(int128_t)和无符号 128 位整数(uint128_t)**纳入标准,同时支持字面量、标准库集成(如流输出)。

核心语法

元素

作用

std::int128_t/std::uint128_t

标准 128 位整数类型

i128/u128

128 位整数字面量后缀

std::numeric_limits<int128_t>

128 位整数的数值范围查询

示例代码
#include <iostream>
#include <limits>
#include <cstdint>
int main() {
    // 128 位整数字面量
    std::int128_t a = 123456789012345678901234567890_i128;
    std::uint128_t b = 987654321098765432109876543210_u128;
    // 运算
    std::int128_t c = a * 2;
    std::uint128_t d = b / 3;
    // 标准库输出支持(C++26 新增)
    std::cout << "a = " << a << std::endl;
    std::cout << "c = a * 2 = " << c << std::endl;
    // 数值范围
    std::cout << "int128_t 最小值:" << std::numeric_limits<std::int128_t>::min() << std::endl;
    std::cout << "uint128_t 最大值:" << std::numeric_limits<std::uint128_t>::max() << std::endl;
    return 0;
}

4. constexpr 的进一步扩展(P1870R6)
功能介绍

C++20 已允许 constexpr 函数使用动态内存和 std::string/std::vector,C++26 进一步扩展:

  • 支持 constexpr 的 std::map/std::unordered_map 等关联容器;
  • 支持编译期文件操作(std::filesystem::read_to_string);
  • 有限的编译期线程操作。
示例代码(编译期构建 map 并读取文件)
#include <iostream>
#include <map>
#include <filesystem>
#include <string>
// C++26:constexpr 函数中使用 std::map
constexpr auto create_version_map() {
    std::map<int, std::string> m;
    m[20] = "C++20";
    m[23] = "C++23";
    m[26] = "C++26";
    return m;
}
// 编译期读取文件内容(假设 content.txt 内容为 "Hello C++26!")
constexpr auto read_file() {
    return std::filesystem::read_to_string("content.txt");
}
int main() {
    // 编译期计算 map
    constexpr auto version_map = create_version_map();
    static_assert(version_map.at(26) == "C++26");
    // 编译期读取文件
    constexpr auto content = read_file();
    static_assert(content == "Hello C++26!");
    std::cout << "C++26 的版本名:" << version_map.at(26) << std::endl;
    std::cout << "文件内容:" << content << std::endl;
    return 0;
}

二、标准库改进

1. std::generator 的正式标准化(P1063R12)
功能介绍

std::generator(生成器协程)在 C++23 中是实验性特性,C++26 将其正式纳入标准库(<generator>),用于简化惰性求值的序列生成(如斐波那契数列、无限序列),支持范围 for 循环。

核心语法

元素

作用

std::generator<T>

生成器类型,返回值为 T 的序列

co_yield

生成序列中的下一个值,并暂停协程

示例代码(生成斐波那契数列)
#include <iostream>
#include <generator> // C++26 正式头文件
// 生成斐波那契数列的生成器
std::generator<unsigned long long> fibonacci(unsigned int n) {
    unsigned long long a = 0, b = 1;
    for (unsigned int i = 0; i < n; ++i) {
        co_yield a; // 生成值并暂停
        auto temp = a + b;
        a = b;
        b = temp;
    }
}
int main() {
    // 范围 for 遍历生成器
    for (auto num : fibonacci(10)) {
        std::cout << num << " "; // 输出:0 1 1 2 3 5 8 13 21 34
    }
    return 0;
}

2. 区间库(Ranges)的扩展(P2494R3)
功能介绍

C++26 为 Ranges 库新增了多个实用视图,包括:

  • std::views::enumerate:为元素添加索引(类似 Python 的 enumerate);
  • std::views::chunk:将区间分割为固定大小的块;
  • std::views::zip_transform:多区间元素的函数转换。
示例代码
#include <iostream>
#include <vector>
#include <ranges>
int main() {
    std::vector<std::string> words = {"C++", "26", "Pattern", "Matching"};
    // 1. std::views::enumerate:带索引遍历
    for (auto [idx, word] : words | std::views::enumerate) {
        std::cout << "索引 " << idx << ": " << word << std::endl;
    }
    // 2. std::views::chunk:分割为大小为 2 的块
    std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7};
    for (auto chunk : nums | std::views::chunk(2)) {
        std::cout << "块:";
        for (int num : chunk) std::cout << num << " ";
        std::cout << std::endl;
    }
    return 0;
}

3. std::expected 的增强(P2505R4)
功能介绍

std::expected(C++23 引入)用于表示'成功值或错误值',C++26 为其新增了链式调用方法(and_then/or_else)和模式匹配支持,简化错误处理。

示例代码
#include <iostream>
#include <expected>
#include <string>
// 解析字符串为整数
std::expected<int, std::string> parse_int(const std::string& s) {
    try {
        return std::stoi(s);
    } catch (...) {
        return std::unexpected("解析失败:非整数");
    }
}
// 检查是否为正数
std::expected<int, std::string> check_positive(int x) {
    return x > 0 ? x : std::unexpected("错误:非正数");
}
// 计算平方
std::expected<int, std::string> square(int x) {
    return x * x;
}
int main() {
    // 链式调用:解析→检查→平方
    auto result = parse_int("10")
        .and_then(check_positive)
        .and_then(square);
    // 模式匹配处理结果
    match (result) {
        case std::expected{var val}:
            std::cout << "结果:" << val << std::endl; // 结果:100
            break;
        case std::expected{std::unexpected{var err}}:
            std::cout << "错误:" << err << std::endl;
            break;
    }
    return 0;
}

三、性能与安全特性

1. 安全的数值转换(P2566R2)
功能介绍

C++26 新增 std::safe_cast,替代传统的 static_cast,在数值转换溢出时抛出 std::overflow_error 异常,避免未定义行为。

示例代码
#include <iostream>
#include <utility> // std::safe_cast
#include <stdexcept>
int main() {
    int a = 1000;
    char b;
    try {
        // 安全转换:int→char(溢出则抛异常)
        b = std::safe_cast<char>(a);
    } catch (const std::overflow_error& e) {
        std::cout << "转换失败:" << e.what() << std::endl; // 转换失败:数值溢出
    }
    return 0;
}
2. 智能指针的边界检查(P2514R3)
功能介绍

C++26 为数组型智能指针新增边界检查选项,避免数组越界访问的未定义行为。

示例代码
#include <iostream>
#include <memory>
int main() {
    // 创建带边界检查的 unique_ptr 数组
    auto arr = std::make_unique<int[]>(5, std::enable_bounds_checking);
    arr[0] = 10;
    arr[4] = 50;
    try {
        arr[5] = 60; // 越界访问,抛 std::out_of_range
    } catch (const std::out_of_range& e) {
        std::cout << "错误:" << e.what() << std::endl;
    }
    return 0;
}

四、总结

C++26 是一次范式级别的更新:

  • 模式匹配和静态反射从根本上简化了复杂逻辑和元编程;
  • 128 位整数、constexpr 扩展提升了语言的表达能力;
  • 标准库的完善(std::generator、Ranges 扩展)让日常开发更高效;
  • 安全特性(std::safe_cast、边界检查)降低了内存错误的风险。

注意:由于 C++26 仍在标准化过程中,部分特性的语法可能会微调,具体以 WG21 最终发布的标准和编译器实现(如 GCC 14、Clang 18)为准。

目录

  1. C++26 核心功能详解:特性、语法与示例代码
  2. 一、核心语言特性
  3. 1. 模式匹配(Pattern Matching)
  4. 功能介绍
  5. 核心语法元素
  6. 示例代码
  7. (1)值模式与范围匹配
  8. (2)类型模式与多态匹配
  9. (3)解构模式(分解聚合类型)
  10. 2. 静态反射(Static Reflection)
  11. 功能介绍
  12. 核心语法
  13. 示例代码(编译期生成对象打印函数)
  14. 3. 128 位整数的语言级支持(P2216R3)
  15. 功能介绍
  16. 核心语法
  17. 示例代码
  18. 4. constexpr 的进一步扩展(P1870R6)
  19. 功能介绍
  20. 示例代码(编译期构建 map 并读取文件)
  21. 二、标准库改进
  22. 1. std::generator 的正式标准化(P1063R12)
  23. 功能介绍
  24. 核心语法
  25. 示例代码(生成斐波那契数列)
  26. 2. 区间库(Ranges)的扩展(P2494R3)
  27. 功能介绍
  28. 示例代码
  29. 3. std::expected 的增强(P2505R4)
  30. 功能介绍
  31. 示例代码
  32. 三、性能与安全特性
  33. 1. 安全的数值转换(P2566R2)
  34. 功能介绍
  35. 示例代码
  36. 2. 智能指针的边界检查(P2514R3)
  37. 功能介绍
  38. 示例代码
  39. 四、总结

更多推荐文章

查看全部
  • Python 列表内存存储本质:差异原因与优化建议
  • AutoGLM-Phone-9B 应用开发:AR 场景智能交互
  • 无人机遥感滑坡与泥石流图像识别数据集
  • C++ 无锁链表实现与原理详解
  • Android 热修复技术:Andfix 框架原理与源码分析
  • llama.cpp CUDA 编译问题排查与性能优化指南
  • Vivado 入门教程:工程创建、仿真与烧录流程
  • 自动化验证码识别系统构建:图像处理与 OCR 实战
  • Elasticsearch 与 Kibana 实战:安装部署及 C++ 客户端封装
  • 使用 Telegram 机器人自动化完成 SheerID 身份认证获取教育权益
  • FSMN VAD 高嘈杂环境优化:speech_noise_thres 调参指南
  • AMD显卡Vulkan后端兼容性修复与llama.cpp本地化部署指南
  • 苍穹外卖实战:SpringTask 定时任务与 WebSocket 实时通信
  • Spring AI 框架入门与应用指南
  • Spring AI 框架入门与实战指南
  • Python 知识图谱分析:NetworkX 库使用指南
  • Spring AI 核心功能与实战入门
  • C++ STL 容器详解:序列、关联与适配器
  • Python 3.14 核心语法特性深度解析与实战案例
  • Trae 通过 SSH 连接远程 Ubuntu Server 进行开发

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online