Clang 中 C++20 协程支持的状态如何?

What is the status of C++20 coroutines support in Clang?

根据 cppreference.com ( https://en.cppreference.com/w/cpp/compiler_support#C.2B.2B20_features ) Clang 从版本 8 开始部分支持 C++20 协程:

但是如果在 Clang trunk(即将发布的第 13 版)中,我写

#include <coroutine>

它导致错误(https://gcc.godbolt.org/z/rTfjbarKz):

/opt/compiler-explorer/gcc-snapshot/lib/gcc/x86_64-linux-gnu/12.0.0/../../../../include/c++/12.0.0/coroutine:334:2: error: "the coroutine header requires -fcoroutines"
#error "the coroutine header requires -fcoroutines"

如果我在命令行中添加 -fcoroutines 标志,Clang 会抱怨(https://gcc.godbolt.org/z/qMrv6nMzE):

clang-13: error: unknown argument: '-fcoroutines'

有什么方法可以开始在 Clang 中使用 C++20 协程吗?

请注意,第一个错误出现在 GCC 标准库中,从中可以推断出 -fcoroutines 选项是针对 GCC 而不是 Clang。

要使用 Clang libc++ 构建,您需要添加选项 -stdlib=libc++。但这将导致找不到 <coroutine> 头文件。

由于 Clang 协同程序仍处于“实验”阶段,因此您必须包含 <experimental/coroutine>

因此您需要更改两件事:

  • 使用 Clang libc++ (-stdlib=libc++)
  • 包括实验头文件(#include <experimental/coroutine>)

另请注意,由于协同程序是实验性的,因此头文件中定义的符号将位于 std::experimental 命名空间中。