C++协程promise_type未声明return_void和return_value是否合法?
C++协程promise_type可省略return_void/return_value的合法性确认
结论先行:对于永远不会执行到协程体末尾的场景(比如无限while(true)循环中持续执行co_yield的协程),其promise_type完全可以不声明return_void和return_value函数,这是符合C++标准的合法写法。
标准规则解读
C++标准仅明确禁止在promise_type中同时声明return_void和return_value(原文:“若在promise_type的作用域中同时找到return_void和return_value的声明,则程序是病态的”),但从未规定这两个函数必须至少存在一个。
底层逻辑支撑
协程只有在正常执行到体末尾时,才会根据协程的返回类型(有无返回值)调用对应的return_void或return_value。如果协程永远不会走到结束点(比如无限循环挂起),编译器不会生成调用这两个函数的代码路径,因此函数缺失不会触发编译错误或未定义行为。
注意事项
必须确保协程不存在任何能执行到体闭合}的路径。一旦存在这种可能,编译器会因找不到对应的return函数直接报错。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

