You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:25:34