首页 > 解决方案 > 协程的返回类型不拥有成员类型:C++20 标准中的 promise_type 是否是未定义的行为?

问题描述

在 C++ Technical Specification N4680中,8.4.4.3 写道:

对于作为非静态成员函数的协程 f,令 P1 表示隐式对象参数(13.3.1)的类型,P2 ... Pn 为函数参数的类型;否则令 P1 ... Pn 为函数参数的类型。令 p1 ... pn 是表示这些对象的左值。令 R 为返回类型,F 为 f 的函数体,T 为 std::experimental::coroutine_traits 类型,P 为由 T::promise_type 表示的类类型。然后,协程的行为就好像它的主体是:

这一段似乎每个协程都应该有一个promise类型。但在 18.11.1.1 中,它说:

1 标头定义了主模板 coroutine_traits,如果 ArgTypes 是类型的参数包,并且如果 R 是具有有效 (14.8.2) 成员类型 promise_type 的类型,则 coroutine_traits 具有以下可公开访问的成员:

using promise_type = typename R::promise_type;

否则, coroutine_traits 没有成员。

似乎coroutine_traits<R,ArgTypes...>不拥有 a是合法的promise_type

所以让我感到困惑的是,a corouinte 的返回类型不拥有 a 是否是未定义的行为promise_type


另一个相关问题:还有其他地方可以询问有关 C++ 标准的问题吗?我觉得在 Stackoverflow 上问这些问题有点奇怪。

标签: c++language-lawyercoroutinec++-coroutine

解决方案


推荐阅读