详解C++26 新特性

 更新时间:2026年03月08日 11:09:40   作者:程序员zgh  
C++26是C++语言的下一个重要标准版本,本文就来详细的介绍C++26 新特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

C++26 是 C++ 语言的下一个重要标准版本,已于 2025 年完成功能冻结。我们来看看 C++26 有哪些新特性。

一、三大核心特性

1.1 静态反射(Static Reflection)

静态反射是 C++26 最重磅的特性之一,在编译期能查询类型、成员、枚举值等结构信息,并把反射结果插入到代码中。

#include <meta>  // 新的反射头文件
#include <string>

enum class Color { red, green, blue };

// 将枚举转换为字符串
template <typename E>
    requires std::is_enum_v<E>
constexpr std::string enum_to_string(E value) {
    template for (constexpr auto e : std::meta::members_of(^E)) {
        if (value == [:e:]) {  // 反射表达式求值
            return std::string(std::meta::name_of(e));
        }
    }
    return "<unnamed>";
}

int main() {
    static_assert(enum_to_string(Color::red) == "red");
    static_assert(enum_to_string(Color::blue) == "blue");

上述代码中:

  • ^E: 反射操作符,获取类型的元数据
  • [:e:]:反射表达式求值,将元数据转换回实际值
  • template for:编译期循环,遍历所有枚举成员

1.2 契约(Contracts)

契约为函数添加前置条件(pre)、后置条件(post),增强可读性。

【前置条件在进入函数前检查,后置条件在函数退出时检查】

int divide(int a, int b)
    [[pre: b != 0]]                    // 前置条件:除数不能为0
    [[post r: r * b == a]]             // 后置条件:结果验证 (返回值用r标记)
{
    return a / b;
}

// 类不变式
class Stack {
    int size_ = 0;
    int* data_ = nullptr;
    
public:
    void push(int val)
        [[pre: size_ < capacity()]]     // 栈未满
        [[post: size() == old size() + 1]]  // 大小增加1
    {
        data_[size_++] = val;
    }
    
    int pop()
        [[pre: size_ > 0]]              // 栈非空
        [[post: size() == old size() - 1]]
    {
        return data_[--size_];
    }
};

1.3 执行控制库(std::execution)

这是 C++26 的“异步执行标准框架”,用来抽象各种执行资源(如 线程池)上的任务调度。它是一个标准化的异步编程框架,用于管理异步执行。

#include <execution>
#include <iostream>

int main() {
    auto sch = std::execution::get_scheduler();  // 获取默认调度器

    // 1) 从调度器得到一个 sender
    auto snd = std::execution::schedule(sch);

    // 2) then 在其上接一个同步任务,返回 int
    auto snd2 = std::execution::then(snd, [] {
        std::cout << "Hello from std::execution\n";
        return 42;
    });

    // 3) 再接一个任务消费 int
    auto snd3 = std::execution::then(snd2, [](int x) {
        std::cout << "Got " << x << "\n";
    });

    // 4) 提交并等待完成(具体细节略有出入,此处为示意)
    std::execution::sync_wait(snd3);
}

二、其他一些新特性

2.1 占位变量

C++26 引入无命名占位符"_",表示“不关心这个值”,可以多次使用。

auto [a, _, _] = std::tuple{1, 2.0, 'x'};
// _ 没有名字,不能用 _ 去读;只表示“占位”

2.2 参数包索引

参数包索引(Pack indexing),允许在包里直接用下标访问某个元素,而不用把整包展开再访问。

template<typename... Ts>
constexpr auto first_plus_last(Ts... values)
    -> Ts...[0]               // 包的第 0 号类型作为返回类型
{
    return Ts...[0](values...[0] + values...[sizeof...(values) - 1]);
}

static_assert(first_plus_last(1, 2, 11) == 12);

2.3 static_assert扩展

static_assert 的第二个消息参数支持任意常量表达式,可以直接用 std::format 等,而不是简单字符串字面量。

struct A { char c; };

static_assert(
    sizeof(A) == 1,
    std::format("Unexpected sizeof: expected 1, got {}", sizeof(A))
);

2.4 <linalg>头文件

提供类似 BLAS 的线性代数接口(如 std::linalg::matrix_product)。

#include <linalg> //新增头文件
#include <mdspan>
#include <array>

int main() {
    std::array<double, 9> a_data = {1,2,3, 4,5,6, 7,8,9};
    std::array<double, 9> b_data = {9,8,7, 6,5,4, 3,2,1};
    std::array<double, 9> c_data{};

    auto A = std::mdspan(a_data.data(), 3, 3);
    auto B = std::mdspan(b_data.data(), 3, 3);
    auto C = std::mdspan(c_data.data(), 3, 3);

    std::linalg::matrix_product(A, B, C);  // C = A * B
}

写在最后:C++26还有很多其他小的特性,如 constexpr增强,大家感兴趣可以继续做一些深入学习。

到此这篇关于详解C++26 新特性的文章就介绍到这了,更多相关C++26 新特性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt增加版本公司等信息两种方式

    Qt增加版本公司等信息两种方式

    在项目中生成exe或者动态库过程中可能需要加入公司信息、版本号、说明等等,下面这篇文章主要给大家介绍了关于Qt增加版本公司等信息的两种方式,需要的朋友可以参考下
    2024-01-01
  • C++实现一个简单消息队列的示例详解

    C++实现一个简单消息队列的示例详解

    消息队列在多线程的场景有时会用到,尤其是线程通信跨线程调用的时候,就可以使用消息队列进行通信。本文将利用C++实现一个简单的消息队列,感兴趣的可以了解一下
    2022-12-12
  • VS中的scanf_s函数和scanf用法及说明

    VS中的scanf_s函数和scanf用法及说明

    这篇文章主要介绍了VS中的scanf_s函数和scanf用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 老生常谈C++ explicit关键字

    老生常谈C++ explicit关键字

    这篇文章主要介绍了C++ explicit关键字,explicit关键字只需用于类内的单参数构造函数前面,由于无参数的构造函数和多参数的构造函数总是显式调用,这种情况在构造函数前加explicit无意义,需要的朋友可以参考下
    2023-03-03
  • Qt实现简单的TCP通信

    Qt实现简单的TCP通信

    这篇文章主要为大家详细介绍了Qt实现简单的TCP通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Opencv LBPH人脸识别算法详解

    Opencv LBPH人脸识别算法详解

    这篇文章主要为大家详细介绍了Opencv LBPH人脸识别算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • opengl实现直线扫描算法和区域填充算法

    opengl实现直线扫描算法和区域填充算法

    这篇文章主要为大家详细介绍了opengl实现直线扫描算法和区域填充算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++中std::stringstream多类型数据拼接和提取用法小结

    C++中std::stringstream多类型数据拼接和提取用法小结

    本文主要介绍了C++中std::stringstream多类型数据拼接和提取用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • C++初始化列表学习

    C++初始化列表学习

    在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示
    2013-09-09
  • C语言实现自动发牌程序

    C语言实现自动发牌程序

    这篇文章主要介绍了利用C语言实现自动发牌程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论