No GCC 15, std::noop_coroutine
a definição de é
{ return std::noop_coroutine_handle(); }
std::noop_coroutine_handle
é definido por:
using noop_coroutine_handle = std::coroutine_handle<std::noop_coroutine_promise>;
Para obter uma corrotina sem operação, escrevemos
std::noop_coroutine()
que (eu acho) é equivalente a
std::noop_coroutine_handle{}
e
std::coroutine_handle<std::noop_coroutine_promise>{}
Então acredito que a biblioteca padrão só precisa fornecer std::noop_coroutine_promise
(junto com certas especializações que a utilizam como um parâmetro de modelo).
Por que o padrão introduziu três novos símbolos? (Parece um pouco arbitrário — apenas minha opinião pessoal.)
Porque pode. Definir um nome específico no padrão, em vez de deixá-lo definido pela implementação, afeta apenas a formatação usada para descrevê-lo.
O padrão ainda precisa descrever o comportamento do tipo de promessa.
Os implementadores teriam que usar algum nome para definir o tipo de promessa para
noop_coroutine
, e o tipo de identificador poderia ser escrito à mão, mas provavelmente teria um alias.