C++20关键特性

0.1 C++20关键特性

C++20 是继 C++11 之后最重要的一次升级,引入了 concepts、ranges、coroutines、modules 和三路比较运算符 等核心能力,被认为是"第二次现代化" 。

这些特性本质解决三类问题:

  • 模板难用(concepts)
  • STL 不直观(ranges)
  • 异步复杂(coroutine)
  • 编译慢(modules)
  • 比较繁琐(<=>)

1 concepts 模板约束

1.1 一、为什么需要 concepts?

传统模板的问题:

cpp 复制代码
template<typename T>
T add(T a, T b) {
    return a + b;
}

👉 如果传入错误类型(比如 string 不支持 +),

👉 编译器报错极其复杂


1.2 二、concept 的核心作用

👉 在编译期约束类型

cpp 复制代码
#include <concepts>

template<typename T>
concept Addable = requires(T a, T b) {
    a + b;
};

1.3 三、使用方式

cpp 复制代码
template<Addable T>
T add(T a, T b) {
    return a + b;
}

1.4 四、效果

  • 编译错误更清晰
  • 模板语义更明确
  • 替代 SFINAE

👉 本质:给模板加"类型接口"


1.5 五、你要掌握的重点

  • requires 表达式
  • concept 定义
  • concept 约束模板

2 ranges

2.1 一、传统 STL 的问题

cpp 复制代码
std::vector<int> v = {1,2,3,4,5};

for (auto it = v.begin(); it != v.end(); ++it) {
    if (*it % 2 == 0) {
        std::cout << *it;
    }
}

👉 啰嗦 + 容易出错


2.2 二、ranges 的核心思想

👉 像管道一样操作数据(函数式风格) (studylib.net)


2.3 三、基本用法

cpp 复制代码
#include <ranges>
#include <vector>
#include <iostream>

std::vector<int> v = {1,2,3,4,5};

for (int x : v 
    | std::views::filter([](int x){ return x % 2 == 0; })
    | std::views::transform([](int x){ return x * 2; })
) {
    std::cout << x;
}

2.4 四、核心组件

  • views::filter
  • views::transform
  • views::take
  • ranges::sort

2.5 五、本质理解

👉 ranges = STL + 管道 + 惰性计算


2.6 六、优势

  • 更简洁
  • 更安全(少越界)
  • 更接近业务表达

3 coroutine 协程

3.1 一、协程是什么?

👉 可以暂停/恢复的函数 (Educative)


3.2 二、为什么需要?

传统异步:

cpp 复制代码
// 回调地狱 / 多线程复杂

3.3 三、C++20 协程关键字

  • co_await
  • co_yield
  • co_return

3.4 四、简单示例(生成器)

cpp 复制代码
#include <coroutine>
#include <iostream>

struct Generator {
    struct promise_type {
        int value;
        auto get_return_object() { return Generator{}; }
        std::suspend_always yield_value(int v) {
            value = v;
            return {};
        }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() {}
    };
};

Generator gen() {
    co_yield 1;
    co_yield 2;
}

3.5 五、本质理解

👉 coroutine = 状态机 + 挂起点


3.6 六、适用场景

  • IO(网络 / 文件)
  • 异步任务
  • 游戏循环
  • 嵌入式事件驱动

3.7 七、关键认知

👉 C++20 只提供"框架",不是完整库 (Educative)


4 modules 替代头文件

4.1 一、传统 include 的问题

cpp 复制代码
#include "a.h"
#include "b.h"

问题:

  • 编译慢
  • 重复包含
  • 宏污染

4.2 二、modules 的核心思想

👉 按模块组织代码,而不是文本复制


4.3 三、基本写法

4.3.1 定义模块

cpp 复制代码
export module math;

export int add(int a, int b) {
    return a + b;
}

4.3.2 使用模块

cpp 复制代码
import math;

int main() {
    add(1, 2);
}

4.4 四、优势

  • 编译更快
  • 不依赖宏
  • 结构更清晰 (Educative)

4.5 五、本质理解

👉 modules = 编译级别的封装(不是文本包含)


4.6 六、现实情况

  • 工业支持还不完全
  • 需要新编译器 / 构建系统

5 三路比较(<=>)

5.1 一、问题

传统比较:

cpp 复制代码
a < b
a > b
a == b

👉 要写很多函数


5.2 二、C++20 解决方案

👉 三路比较运算符 <=>(spaceship)


5.3 三、基本用法

cpp 复制代码
#include <compare>

struct Point {
    int x, y;

    auto operator<=>(const Point&) const = default;
};

5.4 四、效果

👉 自动生成:

  • <
  • >
  • ==
  • !=
  • <=
  • >=

5.5 五、返回值类型


5.6 六、示例

cpp 复制代码
Point a{1,2}, b{2,3};

if ((a <=> b) < 0) {
    // a < b
}

5.7 七、本质理解

👉 <=> = 一次比较,得到所有关系


6 总结(必须记住)

特性 解决问题
concepts 模板类型安全
ranges 数据处理简化
coroutine 异步复杂性
modules 编译与结构
<=> 比较逻辑

7 最关键一句话总结

👉 C++20 本质是:

让 C++ 从"难用但强大" → "强大且可控"


8 学习优先级(给你建议)

  1. concepts(必须掌握)
  2. ranges(高频使用)
  3. coroutine(进阶)
  4. <=>(简单但实用)
  5. modules(了解即可)

相关推荐
青少儿编程课堂2 小时前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
旖-旎2 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
AIFarmer2 小时前
【无标题】
开发语言·c++·算法
昇腾CANN3 小时前
TileLang-Ascend 算子性能优化方法与实操
开发语言·javascript·性能优化·昇腾·cann
John_ToDebug3 小时前
WebHostView 与 TabStrip 交互机制深度解析
c++·chrome·windows
沐知全栈开发3 小时前
ionic 手势事件详解
开发语言
lsx2024063 小时前
Bootstrap 按钮
开发语言
神仙别闹3 小时前
基于 Python 实现 BERT 的情感分析模型
开发语言·python·bert
禾叙_3 小时前
【langchain4j】结构化输出(六)
java·开发语言