协程Promise类initial_suspend和final_suspend方法的静态修饰疑问及Clang-Tidy警告处理咨询
协程Promise类initial_suspend和final_suspend方法的静态修饰疑问及Clang-Tidy警告处理咨询
各位大佬好,我最近在实现自定义协程的Promise类MyCoroutine::Promise时,碰到了一个有点纠结的问题,还带着Clang-Tidy的警告,想请教下大家的看法:
我一开始给initial_suspend和final_suspend方法加了static修饰,代码大概是这样的:
static std::suspend_always initial_suspend() noexcept { return {}; } static std::suspend_always final_suspend() noexcept { return {}; }
用GCC 13测试的时候,这段代码跑起来完全没问题,但当我用Clang-Tidy检查时,在定义协程函数:
MyCoroutine foo() // Clang-Tidy警告出现在这里 { co_return; }
的位置,收到了「Static member accessed through instance」的警告。
仔细想了想,这个警告其实是合理的——因为根据C++协程的执行规则,协程启动时是通过Promise实例来调用promise.initial_suspend()的,而不是直接通过Promise类型调用,所以通过实例访问静态成员就触发了Clang-Tidy的检查逻辑。
现在我有两个方向的疑问:
- 是不是应该直接去掉
static关键字,把这两个方法改成const成员函数?毕竟这些方法根本不需要this指针,而且编译器应该能轻松做内联优化,不会有性能损失。 - 或者保留
static其实是个更合理的选择?有没有什么优雅的方式可以消除这个Clang-Tidy警告?
另外我还注意到,官方的C++协程示例里,有的给这两个方法加了static,有的没加,这更让我拿不定主意了,想听听大家的经验和建议。
内容来源于stack exchange
相关产品推荐
相关产品推荐

