根据 C++20 的协程规范:
使用返回类型声明的函数,该返回类型使用 占位符类型不应为协程。
为什么在这种情况下不允许使用占位符类型?
用于特定协程的协程机制主要基于函数的返回类型。返回类型是协程未来,协程逻辑将从中推断出协程承诺对象,该对象将用于通过返回的未来将协程生成的实际值传递给调用方。
这意味着在co_await
、co_yield
和co_return
中,它们实际上都没有使用协程的返回类型(顺便说一句,这就是为什么co_return
的拼写与return
不同;它具有不同的含义和行为,因此它得到了不同的关键字(。co_return
和co_yield
没有被赋予未来类型本身;他们被赋予一种类型,承诺/未来可以封送给用户。
co_await
表达式的类型与协程的承诺/未来几乎没有关系。它只是一个值,协程可以通过该值安排其恢复,并从中提取某种任意类型的值。计划的恢复并不真正关心当前协程的特定未来/承诺。你可以在std::future<T>
上co_await
,即使你的协程的未来/承诺类型不是任何类型的std::future
。
因此,无法从提供给任何这些关键字的表达式中推断出协程的未来/承诺应该是什么。因此,必须显式指定它。