C++ Lambda中*this隐式引用捕获与this隐式值捕获的区别及疑问
C++ Lambda中*this隐式捕获的两个问题解答
Cppreference中关于Lambda表达式的内容提到:当前对象(*this)在存在捕获默认值时可被隐式捕获。若被隐式捕获,即使捕获默认值为
=,也始终按引用捕获。
1. “*this的隐式引用捕获”与“this的隐式值捕获”有什么区别?
- 捕获目标与语义本质完全不同:
- this的隐式值捕获:当默认捕获为
=时,隐式捕获的是this指针的值拷贝。Lambda闭包中持有这个指针副本,访问对象成员时是通过指针间接指向原对象。如果原对象在Lambda执行前被销毁,后续访问会触发悬空指针问题。 - this的隐式引用捕获:即使默认捕获是
=,这种隐式捕获的是当前对象的引用*。Lambda闭包直接绑定到原对象本身,访问成员时等同于直接引用原对象的成员,行为和默认捕获为&时的隐式捕获一致。
- this的隐式值捕获:当默认捕获为
2. 为何不能通过&*this的方式显式引用捕获*this?
这是由C++的Lambda捕获语法规则决定的:
- 显式捕获列表仅允许捕获标识符(比如变量名、
this指针),而*this是一个表达式(对指针解引用的结果),不属于合法的捕获目标。 - 从语义需求来看,若要引用捕获当前对象,直接使用默认引用捕获
&,或者显式捕获this指针即可——捕获this后,Lambda内部访问*this本质就是对原对象的引用,完全可以满足需求,&*this这种写法既不符合语法规范,也没有实际意义。
内容的提问来源于stack exchange,提问作者Johannes Schaub - litb
相关产品推荐
相关产品推荐

