Standard library header <coroutine> (C++20)
From cppreference.com
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Standard library headers
<compare> (C++20)
<contracts> (C++26)
<coroutine> (C++20)
<cstdint> (C++11)
<source_location> (C++20)
<stdfloat> (C++23)
<version> (C++20)
<concepts> (C++20)
<debugging> (C++26)
<stacktrace> (C++23)
<system_error> (C++11)
<memory_resource> (C++17)
<scoped_allocator> (C++11)
<type_traits> (C++11)
<ratio> (C++11)
<any> (C++17)
<bit> (C++20)
<charconv> (C++17)
<expected> (C++23)
<format> (C++20)
<optional> (C++17)
<stdbit.h> (C++26)
<tuple> (C++11)
<typeindex> (C++11)
<variant> (C++17)
<array> (C++11)
<flat_map> (C++23)
<flat_set> (C++23)
<forward_list> (C++11)
<hive> (C++26)
<mdspan> (C++23)
<span> (C++20)
<unordered_map> (C++11)
<unordered_set> (C++11)
<generator> (C++23)
<ranges> (C++20)
<cuchar> (C++11)
<string_view> (C++17)
<codecvt> (C++11/17/26*)
<regex> (C++11)
<cfenv> (C++11)
<linalg> (C++26)
<numbers> (C++20)
<random> (C++11)
<simd> (C++26)
<stdckdint.h> (C++26)
<chrono> (C++11)
<ccomplex> (C++11/17/20*)
<ciso646> (until C++20)
<cstdalign> (C++11/17/20*)
<cstdbool> (C++11/17/20*)
<ctgmath> (C++11/17/20*)
<cinttypes> (C++11)
<filesystem> (C++17)
<print> (C++23)
<spanstream> (C++23)
<strstream> (C++98/26*)
<syncstream> (C++20)
<atomic> (C++11)
<barrier> (C++20)
<condition_variable> (C++11)
<future> (C++11)
<hazard_pointer> (C++26)
<latch> (C++20)
<mutex> (C++11)
<rcu> (C++26)
<semaphore> (C++20)
<shared_mutex> (C++14)
<stdatomic.h> (C++23)
<stop_token> (C++20)
<thread> (C++11)
<execution> (C++17)
This header is part of the language support library.
Contents
Includes
Classes
No-op Coroutines
(C++20)
(typedef) [edit]
Trivial Awaitables
Functions
No-op Coroutines
(C++20)
(function) [edit]
[edit] Synopsis
#include <compare> namespace std { // coroutine traits template<class R, class... ArgTypes> struct coroutine_traits; // coroutine handle template<class Promise = void> struct coroutine_handle; // comparison operators constexpr bool operator==(coroutine_handle<> x, coroutine_handle<> y) noexcept; constexpr strong_ordering operator<=>(coroutine_handle<> x, coroutine_handle<> y) noexcept; // hash support template<class T> struct hash; template<class P> struct hash<coroutine_handle<P>>; // no-op coroutines struct noop_coroutine_promise; template<> struct coroutine_handle<noop_coroutine_promise>; using noop_coroutine_handle = coroutine_handle<noop_coroutine_promise>; noop_coroutine_handle noop_coroutine() noexcept; // trivial awaitables struct suspend_never; struct suspend_always; }
[edit] Class template std::coroutine_handle
namespace std { template<> struct coroutine_handle<void> { // construct/reset constexpr coroutine_handle() noexcept; constexpr coroutine_handle(nullptr_t) noexcept; coroutine_handle& operator=(nullptr_t) noexcept; // export/import constexpr void* address() const noexcept; static constexpr coroutine_handle from_address(void* addr); // observers constexpr explicit operator bool() const noexcept; bool done() const; // resumption void operator()() const; void resume() const; void destroy() const; private: void* ptr; // exposition only }; template<class Promise> struct coroutine_handle { // construct/reset constexpr coroutine_handle() noexcept; constexpr coroutine_handle(nullptr_t) noexcept; static coroutine_handle from_promise(Promise&); coroutine_handle& operator=(nullptr_t) noexcept; // export/import constexpr void* address() const noexcept; static constexpr coroutine_handle from_address(void* addr); // conversion constexpr operator coroutine_handle<>() const noexcept; // observers constexpr explicit operator bool() const noexcept; bool done() const; // resumption void operator()() const; void resume() const; void destroy() const; // promise access Promise& promise() const; private: void* ptr; // exposition only }; }
[edit] Class std::noop_coroutine_promise
namespace std { struct noop_coroutine_promise {}; }
[edit] Class std::coroutine_handle <std::noop_coroutine_promise >
namespace std { template<> struct coroutine_handle<noop_coroutine_promise> { // conversion constexpr operator coroutine_handle<>() const noexcept; // observers constexpr explicit operator bool() const noexcept; constexpr bool done() const noexcept; // resumption constexpr void operator()() const noexcept; constexpr void resume() const noexcept; constexpr void destroy() const noexcept; // promise access noop_coroutine_promise& promise() const noexcept; // address constexpr void* address() const noexcept; private: coroutine_handle(/* unspecified */); void* ptr; // exposition only }; }
[edit] Class std::suspend_never
namespace std { struct suspend_never { constexpr bool await_ready() const noexcept { return true; } constexpr void await_suspend(coroutine_handle<>) const noexcept {} constexpr void await_resume() const noexcept {} }; }
[edit] Class std::suspend_always
namespace std { struct suspend_always { constexpr bool await_ready() const noexcept { return false; } constexpr void await_suspend(coroutine_handle<>) const noexcept {} constexpr void await_resume() const noexcept {} }; }