为什么协程不允许使用占位符返回类型?
Why is a placeholder return type not allowed for coroutines?
根据 C++20 的协程规范:
使用返回类型声明的函数,该返回类型使用 占位符类型不应为协程。
为什么在这种情况下不允许使用占位符类型?
用于特定协程的协程机制主要基于函数的返回类型。返回类型是协程未来,协程逻辑将从中推断出协程承诺对象,该对象将用于通过返回的未来将协程生成的实际值传递给调用方。
这意味着在co_await
、co_yield
和co_return
中,它们实际上都没有使用协程的返回类型(顺便说一句,这就是为什么co_return
的拼写与return
不同;它具有不同的含义和行为,因此它得到了不同的关键字(。co_return
和co_yield
没有被赋予未来类型本身;他们被赋予一种类型,承诺/未来可以封送给用户。
co_await
表达式的类型与协程的承诺/未来几乎没有关系。它只是一个值,协程可以通过该值安排其恢复,并从中提取某种任意类型的值。计划的恢复并不真正关心当前协程的特定未来/承诺。你可以在std::future<T>
上co_await
,即使你的协程的未来/承诺类型不是任何类型的std::future
。
因此,无法从提供给任何这些关键字的表达式中推断出协程的未来/承诺应该是什么。因此,必须显式指定它。
相关文章:
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- 为什么协程不允许使用占位符返回类型?
- 非类型模板参数中的占位符类型是否涉及作为模板参数传递的函数的重载解析?
- 是否可以使用自动占位符来推断非类型模板参数中的函数结果
- 为什么 C++ 从推断的返回类型中去除引用限定符,为什么生存期延长不起作用?
- 尾随返回类型中的占位符类型的用途是什么
- 如何在折叠过程中获取成员类型的提升::mpl 占位符
- 在另一个函数中使用std::bind返回对象和占位符作为参数
- 非类型模板参数的占位符类型在模板模板参数的情况下是否可以互换
- 为什么编译器需要在已经类限定的成员函数定义的返回类型上使用类限定符
- 模板引用折叠正在删除常量引用返回类型的cv限定符
- 模板占位符未在成员的返回类型中定义,仍然可以正常工作
- 尾随返回类型、声明和引用限定符:它们能一起工作吗?
- 如何在c++1y中保留cv限定符或返回类型推导中的引用
- 增强精神占位符类型转换
- 如何从带有cv和引用限定符的std::函数中获取参数和返回类型
- 尾随返回类型中的占位符是否覆盖初始占位符
- 在boost MPL序列中搜索带有boost占位符的类型