c++20新特性
c++20新特性
C++20 是 C++ 标准的一个重要版本,引入了许多新特性和改进,以下是一些主要的新特性:
文章目录
- c++20新特性
- 1. 语言特性
- 模块(Modules)
- 协程(Coroutines)
- 概念(Concepts)
- consteval
- constexpr的增强
- [[likely]]和[[unlikely]]属性
- 默认模板参数的扩展
- 2. 标准库特性
- std::span
- std::jthread
- 同步原语:std::latch 和 std::barrier
- std::source_location
- std::ranges库
- std::format
- 3. 其他改进
- Lambda 表达式的增强
- 三向比较运算符(`<=>`)
1. 语言特性
模块(Modules)
模块通过引入“导入(import)”和“导出(export)”概念,替代传统的头文件机制,减少了编译时间,避免头文件互相包含的问题,使代码组织更清晰。例如:
// example_module.cppm
export module example_module;
export namespace Example {
class Student {
std::string name;
int age;
public:
Student(std::string _name, int _age) : name(_name), age(_age) {}
std::string getName() const { return name; }
int getAge() const { return age; }
};
}
// main.cpp
import example_module;
int main() {
Example::Student stu("billy", 18);
return 0;
}
协程(Coroutines)
协程是一个特殊的函数,可以在执行过程中挂起(suspend)并在稍后恢复(resume)。它让异步编程更接近同步编程风格,减少了异步操作的复杂度。例如:
std::future<int> coroutine() {
auto task = std::async(std::launch::async, []() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
});
int result = co_await std::move(task);
co_return result;
}
概念(Concepts)
概念为模板编程提供了更强大的类型约束机制,使得代码更加清晰、易读,并且能够在编译期更早地发现错误。例如:
template <typename T>
concept Integral = std::is_integral_v<T>;
template <Integral T>
T add(T a, T b) {
return a + b;
}
consteval
consteval
用于声明一个函数必须在编译时求值,如果在运行时调用,编译器会报错。这进一步扩展了C++的编译时计算能力。例如:
consteval int square(int x) {
return x * x;
}
constexpr的增强
C++20进一步扩展了constexpr
的功能,允许在constexpr
函数中使用更多语言特性,如动态内存分配。
[[likely]]和[[unlikely]]属性
这些属性用于向编译器提供分支预测的提示,帮助优化代码。例如:
if (condition) [[likely]] {
// 代码块
} else [[unlikely]] {
// 代码块
}
默认模板参数的扩展
允许为模板的非类型参数和模板模板参数提供默认值。
2. 标准库特性
std::span
std::span
是一个轻量级、非拥有的视图,可以表示连续的对象序列,提供了一种安全且高效的方式来处理数组、std::array
、std::vector
等连续存储的数据结构。例如:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::span<int> vecSpan(vec);
std::jthread
std::jthread
是一个新线程类,相比 std::thread
更安全,会自动处理线程的清理工作,并提供内置的停止机制。例如:
void cancellableThread(std::stop_token st) {
while (!st.stop_requested()) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main() {
std::jthread jt(cancellableThread);
jt.request_stop();
}
同步原语:std::latch 和 std::barrier
std::latch
是一种一次性的同步原语,std::barrier
是一种可重复使用的同步原语,用于在多线程环境中协调线程的执行。
std::source_location
提供了获取当前代码位置(如文件名、行号)的功能,类似于__FILE__
和__LINE__
,但更灵活。
std::ranges库
提供了范围(Range)的概念,支持范围的迭代、算法操作等,进一步扩展了STL的功能。
std::format
提供了类似于Python的str.format()
的格式化字符串功能,比传统的std::stringstream
更安全、更灵活。
3. 其他改进
Lambda 表达式的增强
C++20 引入了模板 Lambda 和约束 Lambda,允许在 Lambda 表达式中使用模板参数和类型约束。例如:
cpp复制
auto add = [](auto a, auto b) { return a + b; };
三向比较运算符(<=>
)
三向比较运算符可以简化比较逻辑,返回一个强类型的结果(std::strong_ordering
或 std::weak_ordering
)。
上述只是列举了部分新特性,详细的可以查看官方文档!