如何理解C++20协程参数拷贝的const/volatile限定符标准表述?
C++协程参数的const/volatile限定性困惑解析
核心结论:二者无矛盾,针对的是两个不同对象
[dcl.fct.def]/13 和注2的描述分别指向协程参数处理过程中的两个独立对象,不存在冲突:
协程帧内的参数副本:按照[dcl.fct.def]/13规定,若你声明的协程参数是
const T或volatile T类型,协程调用时创建并存储在协程帧中的参数副本会完整保留这些cv(const/volatile)限定符。比如声明task f(const int x),协程帧里的x副本类型就是const int。原参数对象:注2明确的是「用于复制到协程帧的原参数对象」——也就是协程调用时先按普通函数规则创建的临时参数对象——永远不会带有const或volatile限定,哪怕你声明的参数是cv修饰的类型。
原参数对象无cv限定的标准依据
直接的规定就是[dcl.fct.def]/13的注2本身:
Note 2: The original parameter objects are never const-qualified or volatile-qualified. — end note
这是C++标准对协程参数处理逻辑的明确注释补充,无需额外条款佐证。
直观示例
#include <coroutine> struct task { struct promise_type { task get_return_object() { return {}; } std::suspend_never initial_suspend() { return {}; } std::suspend_never final_suspend() noexcept { return {}; } void return_void() {} void unhandled_exception() {} }; }; // 声明参数为const int task f(const int x) { // 此处的x是协程帧内的副本,类型为const int // 而复制这个x的原参数对象(临时创建的普通函数参数)类型是int,无cv限定 co_return; } int main() { int val = 10; f(val); return 0; }
内容的提问来源于stack exchange,提问作者jacobsa
相关产品推荐
相关产品推荐

