系列文章目录
四大模块
毋庸置疑,C++20 将会和 C++11 一样,从根本上改变我们的 C++ 编程方式。C++20 中引入了四大模块:
- Ranges
- Coroutines
- Concepts
- Modules
Ranges 库使其能够在容器上直接表达算法,通过管道符号组合算法,并将其用于数据流中。
Coroutines 库让 C++ 异步编程能力更加强大,甚至可能成为主流。Coroutines 是多任务合作、事件循环、管道的基础。
Concepts 将改变我们对模板编程的思考与方式。它们能够描述模板具有哪些特性,如果不满足这些特性,你会得到一个简短的错误信息,而不是一大堆不知所云的编译器错误。
Modules 引进了 import
官架子,让 C++ 在 #include
的基础上支持更现代化的模块设计,减轻传统头文件带来的一些问题,提升编译的速度,并带来更简单的构建包的方式。
除了以上四大模块外,还有一些亮点,包括:
- 三路比较运算符
<=>
- 字符串字面量作为模板参数
- 日历和时区功能
- std::span
- constexpr 虚函数
- 重定义 volatile
- 原子运算补充:
std::atomic_ref<T>
和std::atomic<std::shared_ptr<T>>
- 新的同步机制,例如信号量(Semaphore)、锁存器(Latch)和屏障(Barrier)
- constexpr string & vector
- 改进的线程
std::jthread
编译器支持情况
学习 C++20 最好的方式就是多写多用新特性,如果你想学习它,那么需要一款支持 C++20 的编译器。目前,可以在 cppreference.com/compiler_support 看到各编译器对 C++20 的支持情况。
上面的截图只是其中一部分,完整列表请大家自行查看。
Hello C++20
有时候安装支持 C++20 的编译器是一件费事费力的事情,好在有在线编译器可以满足我们学习 C++20 的需求,Wandbox 支持在线 C++ 编程,截止目前为止,它支持最新的 gcc 11 和 clang 12.0,这两个最新的编译器已经支持不少新特性,可以愉快的在 Wandbox 上学习了。
让我们写个 Hello World 来开始 C++20 的学习之旅吧。
C++20 中引入了 <version>
头文件,提供关于标准库的信息,例如发布时间等。我们试试这个头文件吧
#include <version>
#include <iostream>
using namespace std;
#define COMPILER_FEATURE_VALUE(value) #value
#define COMPILER_FEATURE_ENTRY(name) { #name, COMPILER_FEATURE_VALUE(name) }
struct CompilerFeature {
CompilerFeature(const char* name = nullptr, const char* value = nullptr)
: name(name), value(value) {}
const char* name;
const char* value;
};
int main()
{
CompilerFeature x = COMPILER_FEATURE_ENTRY(__cplusplus);
cout << "name:" << x.name << endl;
cout << "value:" << x.value << endl;
return 0;
}
总结
C++20 中引入了四大模块以及一堆有用的特性,它将极大的改变 C++ 的编码方式。在cppreference.com/compiler_support 上可以看到编译器对 C++20 的支持情况,并且在 Wandbox上,可以选择 gcc 或者 clang 来学习 C++20。