首页 > 解决方案 > 为什么协程不允许使用占位符返回类型?

问题描述

根据C++20 的协程规范

使用占位符类型的返回类型声明的函数不应是协程。

为什么在这种情况下不允许使用占位符类型?

标签: c++placeholderc++20c++-coroutine

解决方案


用于特定协程的协程机制主要基于函数的返回类型。返回类型是协程 Future,协程逻辑会从中推导出协程 promise 对象,该对象将用于将协程生成的实际值通过返回的 Future 传递给调用者。

这意味着co_await,co_yieldco_return,它们都没有真正使用协程的返回类型(顺便说一句,这就是为什么co_return拼写不同的原因return;它具有不同的含义和行为,因此它得到了不同的关键字)。co_return并且co_yield没有给出未来类型本身;他们被赋予了一种承诺/未来可以编组给用户的类型。

并且co_await表达式的类型与协程的承诺/未来几乎没有关系。它只是一个值,协程可以通过它来安排其恢复,并且可以从中提取某种任意类型的值。预定的恢复并不真正关心当前协程的特定未来/承诺。即使您的协程的未来/承诺类型不是任何类型,您也可以co_await使用。std::future<T>std::future

所以没有办法从提供给这些关键字的表达式中推断出协程的未来/承诺应该是什么。因此,您必须明确指定它。


推荐阅读