C++ 20 新增特性以及代码示例
目录
1. 概念(Concepts)
2. 协程(Coroutines)
3. 模块(Modules)
4. 三路比较运算符(<=>)
5. 范围库(Ranges)
6. std::format格式化库
7. constexpr增强
8. std::span
9. std::jthread
10. consteval函数
以下是C++20的核心特性及代码示例说明:
1. 概念(Concepts)
约束模板参数类型,提升泛型编程的可读性和错误提示
template<typename T>
concept Integral = std::is_integral_v<T>;template<Integral T>
T add(T a, T b) { return a + b; } // 仅接受整数类型
add(5, 3); // 合法
add(2.5, 1.0); // 编译错误
2. 协程(Coroutines)
支持异步编程和生成器模式,通过挂起/恢复函数简化逻辑
#include <coroutine>
generator<int> range(int start, int end) {for (int i = start; i < end; ++i)co_yield i; // 生成值并挂起
}
auto gen = range(1, 4);
std::cout << gen.next(); // 输出1
3. 模块(Modules)
替代传统头文件,减少编译依赖
// math.ixx(模块文件)
export module math;
export int add(int a, int b) { return a + b; }// main.cpp
import math;
int main() { add(2, 3); }
4. 三路比较运算符(<=>)
简化比较运算符的重载
struct Point {int x, y;auto operator<=>(const Point&) const = default; // 自动生成==, <, >等
};
Point a{1, 2}, b{1, 3};
std::cout << (a < b); // 输出true
5. 范围库(Ranges)
提供链式操作容器的现代方式
#include <ranges>
std::vector<int> v = {1, 2, 3, 4, 5};
auto even = v | std::views::filter([](int x) { return x % 2 == 0; });
for (int i : even) std::cout << i; // 输出2 4
6. std::format格式化库
类型安全的字符串格式化
#include <format>
std::string s = std::format("{} + {} = {}", 2, 3, 5); // "2 + 3 = 5"
7. constexpr增强
支持动态内存分配和虚函数
constexpr int compileTimeSum() {int* arr = new int[3]{1, 2, 3}; // 编译期分配int sum = arr[0] + arr[1];delete[] arr;return sum;
}
static_assert(compileTimeSum() == 3);
8. std::span
轻量级非拥有视图,安全访问连续内存
int arr[] = {1, 2, 3};
std::span<int> s(arr);
s[1] = 42; // 修改arr[1]
9. std::jthread
自动合并的线程类型
#include <thread>
std::jthread t([] { std::cout << "Thread running"; }); // 析构时自动join
10. consteval函数
强制编译时求值的函数
consteval int square(int n) { return n * n; }
constexpr int x = square(5); // 必须在编译期计算
这些特性显著提升了代码的简洁性、安全性和性能