Standard library header <coroutine> (C++20)
From cppreference.com
This header is part of the language support library.
Includes | ||
(C++20) | Three-way comparison operator support | |
Classes | ||
(C++20) | trait type for discovering coroutine promise types (class template) | |
(C++20) | used to refer to a suspended or executing coroutine (class template) | |
hash support for std::coroutine_handle (class template specialization) | ||
No-op Coroutines | ||
(C++20) | used for coroutines with no observable effects (class) | |
(C++20) | std::coroutine_handle<std::noop_coroutine_promise>, intended to refer to a no-op coroutine (typedef) | |
Trivial Awaitables | ||
(C++20) | indicates that an await-expression should never suspend (class) | |
(C++20) | indicates that an await-expression should always suspend (class) | |
Functions | ||
(C++20) | compares two coroutine_handle objects (function) | |
No-op Coroutines | ||
(C++20) | creates a coroutine handle that has no observable effects when resumed or destroyed (function) |
[edit]Synopsis
#include <compare> namespace std {// coroutine traitstemplate<class R, class... ArgTypes>struct coroutine_traits; // coroutine handletemplate<class Promise =void>struct coroutine_handle; // comparison operatorsconstexprbool operator==(coroutine_handle<> x, coroutine_handle<> y)noexcept;constexpr strong_ordering operator<=>(coroutine_handle<> x, coroutine_handle<> y)noexcept; // hash supporttemplate<class T>struct hash;template<class P>struct hash<coroutine_handle<P>>; // no-op coroutinesstruct 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 awaitablesstruct suspend_never;struct suspend_always;}
[edit]Class template std::coroutine_handle
namespace std {template<>struct coroutine_handle<void>{// construct/resetconstexpr coroutine_handle()noexcept;constexpr coroutine_handle(nullptr_t)noexcept; coroutine_handle& operator=(nullptr_t)noexcept; // export/importconstexprvoid* address()constnoexcept;staticconstexpr coroutine_handle from_address(void* addr); // observersconstexprexplicit operator bool()constnoexcept;bool done()const; // resumptionvoid operator()()const;void resume()const;void destroy()const; private:void* ptr;// exposition only}; template<class Promise>struct coroutine_handle {// construct/resetconstexpr coroutine_handle()noexcept;constexpr coroutine_handle(nullptr_t)noexcept;static coroutine_handle from_promise(Promise&); coroutine_handle& operator=(nullptr_t)noexcept; // export/importconstexprvoid* address()constnoexcept;staticconstexpr coroutine_handle from_address(void* addr); // conversionconstexpr operator coroutine_handle<>()constnoexcept; // observersconstexprexplicit operator bool()constnoexcept;bool done()const; // resumptionvoid 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>{// conversionconstexpr operator coroutine_handle<>()constnoexcept; // observersconstexprexplicit operator bool()constnoexcept;constexprbool done()constnoexcept; // resumptionconstexprvoid operator()()constnoexcept;constexprvoid resume()constnoexcept;constexprvoid destroy()constnoexcept; // promise access noop_coroutine_promise& promise()constnoexcept; // addressconstexprvoid* address()constnoexcept;private: coroutine_handle(/* unspecified */);void* ptr;// exposition only };}
[edit]Class std::suspend_never
namespace std {struct suspend_never {constexprbool await_ready()constnoexcept{returntrue;}constexprvoid await_suspend(coroutine_handle<>)constnoexcept{}constexprvoid await_resume()constnoexcept{}};}
[edit]Class std::suspend_always
namespace std {struct suspend_always {constexprbool await_ready()constnoexcept{returnfalse;}constexprvoid await_suspend(coroutine_handle<>)constnoexcept{}constexprvoid await_resume()constnoexcept{}};}