为何std::noop_coroutine()未被定义为constexpr?
关于std::noop_coroutine()是否应为constexpr的疑问
当前std::noop_coroutine()的签名不含constexpr,其实现如下:
inline std::noop_coroutine_handle noop_coroutine() noexcept { return noop_coroutine_handle(); }
(参考GCC libstdc++源码)
这导致无法定义constexpr的std::noop_coroutine_handle实例:
constexpr std::noop_coroutine_handle noop = std::noop_coroutine(); // 编译错误
我清楚C++标准并未要求该函数是constexpr,但这是有意的设计,还是标准的疏漏?
实际上,std::noop_coroutine_handle拥有私有的constexpr默认构造函数;同时std::coroutine_handle<void>和std::coroutine_handle<Promise>都具备constexpr构造函数与from_address方法(仅from_promise非constexpr)。
既然能为void及所有Promise类型定义constexpr的coroutine_handle,却无法对noop_coroutine_handle这么做,这显然不合情理。
我在本地测试发现,只需给noop_coroutine()添加一个constexpr关键字即可让代码正常运行:
inline constexpr std::noop_coroutine_handle noop_coroutine() noexcept { return noop_coroutine_handle(); } // 现在用户可以正常定义constexpr的noop_coroutine_handle constexpr std::noop_coroutine_handle noop = std::noop_coroutine();
内容的提问来源于stack exchange,提问作者DoZerg
相关产品推荐
相关产品推荐

