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
相关产品推荐
相关产品推荐

