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

C++ Lambda捕获未声明变量语法及类型推导疑问

关于Lambda表达式[sum = 0]捕获语法的解析

你的理解完全正确

  • [lhs = rhs]是C++11引入的初始化捕获语法——不管外部作用域有没有同名变量,都会在闭包类型里创建一个名为lhs的非静态数据成员,并用rhs的值初始化它。说白了就是在闭包内部定义并初始化这个成员,和外部的同名变量(如果有的话)完全是两个独立的东西。
  • 因为sum是闭包的成员变量,每次调用Lambda时操作的都是同一个闭包对象里的sum,所以值会一直保留,不会每次调用都重置。
  • 默认情况下,Lambda的调用运算符operator()是const成员函数,闭包的成员会被当成const对待;加上mutable后,operator()不再是const,闭包成员也就可以被修改,不再是const类型。

Lambda体内变量的类型确定规则

  • 初始化捕获的变量lhs,类型是rhs的类型经过**退化(decay)**后的结果:
    • 数组类型会退化为指针;
    • 函数类型退化为函数指针;
    • 引用会被移除,保留引用的目标类型;
    • 顶层的const和volatile会被去掉。
      举个例子:[sum = 0]里0是int,所以sum就是int;如果写[arr = int[3]{1,2,3}],arr的类型会变成int*。
  • 要是你想指定具体类型,可以直接用显式的类型转换,或者C++17及以后支持的auto声明:
    • [sum = 0LL]:sum的类型是long long;
    • [sum = static_cast<double>(0)]:sum是double;
    • C++17及以后还能写[auto sum = 0],让编译器推导类型(和[sum=0]效果一样,但更直观)。

内容的提问来源于stack exchange,提问作者Oersted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:07:19