c++20 特性

学习 c++20 首先要有支持相关特性的编译器

msvc2019 如果和工作用的 msvc2015 安装在同一台机器上,在使用 vcpkg 时会产生冲突

clang 在 windows 下的使用并不平滑,如果初衷是 c++20,就不要舍本逐末。在熟悉 c++20 后回头折腾 clang

虚拟机上安装 msvc2019,Hyper-V 是好的选择吗?如果要用 VMware 还是躲开 Hyper-V

安装 msvc2019 对 win10 版本有要求,直接使用两者的在线安装包是省心省力(耐心等下载)的选择。

c++20 的模块 module 如何处理预编译选项的,比如如何处理标准库 中 Debug/Release 的不同定义

Overview of modules in C++

Visual Studio 中的模块接口文件需要 ixx 扩展名

编译器在处理头文件和模块的关系时,引入了 global module fragment (全局模块片段)的概念

  • 单独使用 module 关键字:用于文件开头,标识内容归属
  • 使用 export module 关键字:用于模块接口文件 .ixx
  • 单独使用 export 关键字:导出什么
  • import 关键词:先包含头文件,再导入模块

The import declaration must appear after the module declaration and after any #include directives, but before any declarations in the file.

模块声明和头文件?

c++20 的三大块:concepts, modules, coroutines

C++20 - 下一个大版本功能确定

兜兜转转大半年,还是再次碰上协程,啊哈

我接触协程起始于 asio 库,当时不得其法,异步 io 叠加其中的三类协程,弯弯绕绕很混乱。这次单纯地从 c++20 的协程 入手,慢慢理解。以下的“协程”,狭义的特指 C++20 标准引入的无栈协程,而非更宽泛意义上的概念。

概念上,协程就是能够重入的函数。具体实现上,多种多样,复杂程度和理解难度也不一。

Coroutines are stackless: they suspend execution by returning to the caller and the data that is required to resume execution is stored separately from the stack.

协程暂停执行,控制权返回给调用者。为了恢复执行保存的状态和数据,不在栈上。

c++20 中什么样子的函数才是协程呢?

  1. 函数定义使用了 co_await co_yield co_return
  2. 函数返回值满足以下要求:??????? 定义了某些特定方法的类型。

协程的返回值并不是普通的值而是一个可以和外界(或另外一个协程)相互协作的对象

每个协程关联了 promise object , coroutine handle, coroutine state. 这里的 promise object 和 std::promise 无关

  • the promise object, manipulated from inside the coroutine.
  • the coroutine handle, manipulated from outside the coroutine.
  • the coroutine state, which is an internal, heap-allocated object that contains the promise object, …

The Promise type is determined by the compiler from the return type of the coroutine using std::coroutine_traits.

作为一名普通的程序员,我大概率是只是用别人写好的协程库,不会自己写的。

封装异步接口:用户的便利建立在库开发者的辛苦之上