C++20 新特性详解:相较于 C++17 的主要改进
C++20 是 C++ 编程语言的一次重大更新,引入了许多革命性的新特性。以下是 C++20 相较于 C++17 的主要变化:
一、语言核心特性
1. 概念(Concepts)
对模板参数进行约束的机制
cpp
template <typename T>
concept Integral = std::is_integral_v<T>;
template <Integral T> // 使用概念约束
T add(T a, T b) {
return a + b;
}
2. 模块(Modules)
替代传统头文件的新代码组织方式
cpp
// math.ixx (模块接口文件)
export module math;
export int add(int a, int b) {
return a + b;
}
// main.cpp
import math;
int main() {
add(3, 4);
}
3. 协程(Coroutines)
支持挂起和恢复的函数
cpp
#include <coroutine>
generator<int> range(int start, int end) {
for (int i = start; i < end; ++i)
co_yield i; // 挂起并返回值
}
for (int i : range(1, 10)) {
std::cout << i << " ";
}
4. 三向比较(Spaceship Operator)
cpp
#include <compare>
struct Point {
int x, y;
auto operator<=>(const Point&) const = default;
};
Point a{1,2}, b{1,3};
if (a < b) { ... } // 自动生成所有比较运算符
5. 初始化语句的范围 for 循环
cpp
for (int i = 0; auto& x : vec) {
std::cout << i++ << ": " << x << "\n";
}
6. constexpr 增强
constexpr虚函数constexpr动态内存分配constexpr try-catch块constexpr std::vector和std::string
二、标准库增强
1. Ranges 库
cpp
#include <ranges>
#include <algorithm>
auto even = [](int i) { return i % 2 == 0; };
auto square = [](int i) { return i * i; };
for (int i : std::views::iota(0, 10)
| std::views::filter(even)
| std::views::transform(square)) {
std::cout << i << " ";
}
2. 格式化库(std::format)
cpp
#include <format>
std::string s = std::format("Hello {}! The answer is {}.", "world", 42);
// "Hello world! The answer is 42."
3. 日历和时区支持
cpp
#include <chrono>
auto now = std::chrono::system_clock::now();
std::cout << std::format("{:%Y-%m-%d %H:%M:%S}", now);
4. 位操作
cpp
#include <bit>
uint32_t x = 0x12345678;
if (std::endian::native == std::endian::little) {
// 小端系统
}
auto y = std::rotl(x, 8); // 循环左移
5. 同步库增强
std::atomic_refstd::counting_semaphorestd::latchstd::barrier
三、其他重要特性
1. 指定初始化
cpp
struct Point { int x; int y; int z; };
Point p { .x = 1, .y = 2, .z = 3 };
2. 允许 lambda 捕获 [=, this]
cpp
struct S {
int x;
void f() {
auto l = [=, this] { return x; }; // C++20
}
};
3. 新的属性
[[no_unique_address]][[likely]]和[[unlikely]]
4. 数学常量
cpp
#include <numbers>
auto area = std::numbers::pi * r * r;
四、总结
C++20 的主要改进包括:
- 概念:使模板编程更安全、更直观
- 模块:改进代码组织和构建时间
- 协程:支持异步编程模型
- Ranges:更优雅的算法和视图组合
- 格式化:类型安全、高效的字符串格式化
- 日期时间:全面的日历和时区支持
- 三向比较:简化比较运算符的实现
这些变化使 C++20 成为自 C++11 以来最重要的版本,极大地提升了代码的表达能力、安全性和性能。