c++ 20 有什么新的功能
C++20 是继 C++11 之后最具革命性的 C++ 标准更新之一,引入了许多强大的新特性,旨在提高代码的表达力、类型安全性、编译效率和开发体验。以下是 C++20 的主要新功能分类总结:
一、四大核心语言特性
1.模块(Modules)
- 目的:替代传统的
#include头文件机制,解决编译速度慢、宏污染、依赖混乱等问题。 - 用法:
// 定义模块 math.ixx export module math; export int add(int a, int b) { return a + b; } // 使用模块 import math; int result = add(2, 3); - 优势:显著减少编译时间,改善封装性。
2.概念(Concepts)
- 目的:为模板参数提供类型约束,使模板错误信息更清晰,代码更易读。
- 用法:
template<typename T> concept Integral = std::is_integral_v<T>; template<Integral T> T square(T x) { return x * x; } - 优势:提升泛型编程的可读性和安全性。
3.协程(Coroutines)
- 目的:支持异步编程和生成器模式,简化状态机实现。
- 关键字:
co_yield,co_return,co_await - 示例:
generator<int> range(int start, int end) { for (int i = start; i < end; ++i) co_yield i; } - 注意:标准库未提供现成的协程任务类型,需自行实现或使用第三方库(如 cppcoro)。
4.范围库(Ranges)
- 目的:提供组合式、惰性求值的算法管道,替代传统迭代器风格。
- 用法:
auto evens = view::filter(numbers, [](int n){ return n % 2 == 0; }) | view::transform([](int n){ return n * 2; }); - 优势:代码更简洁、声明式,支持链式操作。
二、其他重要语言特性
三向比较运算符(Spaceship Operator
<=>)
自动推导比较逻辑,减少重复代码:auto operator<=>(const Point&) const = default;指定初始化(Designated Initializers)
类似 C99,允许按成员名初始化:Point p{.x = 1, .y = 2};consteval和constinitconsteval:函数必须在编译期执行。constinit:变量必须在静态初始化阶段完成初始化。
和属性
提示编译器分支概率,优化生成代码。增强的
constexpr
支持更多操作(如动态内存分配、try-catch 等),使更多计算可在编译期完成。using enum声明
简化枚举成员访问:using enum Color; auto c = Red; // 而非 Color::Red结构化绑定扩展
支持对更多类型(如数组)进行结构化绑定。
三、标准库新增功能
std::format
类型安全、可扩展的字符串格式化,替代printf和sprintf:std::string s = std::format("Hello, {}!", "world");日历与时区支持(
<chrono>扩展)
新增year_month_day、zoned_time等类型,支持时区转换和日期运算。位操作工具(
<bit>)
提供std::popcount,std::rotl,std::endian等实用函数。原子操作的等待/通知机制(
std::atomic::wait/notify)
高效实现无锁同步原语。std::span
表示连续内存的非拥有视图,替代裸指针+长度组合。std::jthread
改进的线程类,支持自动加入(join)和协作式中断。
四、工程价值
- 编译速度提升:模块可大幅减少重复编译。
- 代码更安全:Concepts 和
std::span等减少越界和类型错误。 - 异步编程简化:协程让异步逻辑像同步代码一样直观。
- 现代泛型编程:Concepts + Ranges 使模板代码更易写、易读、易调试。
注意事项
- 编译器支持:主流编译器(GCC 10+, Clang 10+, MSVC 2019 16.8+)已逐步支持 C++20,但部分特性(如完整模块系统)仍需较新版本。
- 迁移成本:大规模项目引入模块或协程可能需要重构现有架构。
如需具体某个特性的详细示例或使用场景,欢迎进一步提问!
