- 主题:lambda不能capture this指针
void A::f()
{
auto fn = [this](this auto){
A_mem_func();
};
…
}
编译是过不了的,说deduce this是static function,不能用this。
问题是lambda函数体内的this并不指向lambda object,而是指向encapsulating class的this啊。
gcc一直过不了,需要捕获thisptr = this, 然后 thisptr->A_mem_func(); 来绕过这个bug。
也不知道gcc 15修了没,还是说有啥别的考虑。
- 来自 水木社区APP v3.5.7
--
FROM 116.169.10.*
查一下deducing-this的use case. 基本都和template有关,不写template别用这玩意,别老想着枪毙自己
--
FROM 115.193.188.*
这玩意基本用途是为了把
struct A
{
void f();
void f() &&; // 当然,首先你得知道这是啥
}
这种东西用一个template解决
然后往邪门上走就是:
比如你写了个lambda, 然后你要把这玩意传来传去,然后内部的capture需要根据你这个lambda是rvalue还是lvalue有不同处理
--
FROM 115.193.188.*
你这里面captured this是class A的一个instance.
this auto,如果我理解的正确,表示的是fn这个lambda instance,因为 lambda定义本质上是一个struct定义。
相当于你同一个变量定义了两次,编译器肯定要报错,至于报static function可能是编译器回溯错误类型的问题。
【 在 allegro 的大作中提到: 】
: void A::f()
: {
: auto fn = [this](this auto){
: ...................
--
FROM 115.193.188.*
我们无论如何不会/不该尝试在lambda函数体内访问lambda的this。这应该是编译器支持deduce this的bug。
- 来自 水木社区APP v3.5.7
【 在 ziqin 的大作中提到: 】
: 你这里面captured this是class A的一个instance.
:
: this auto,如果我理解的正确,表示的是fn这个lambda instance,因为 lambda定义本质上是一个struct定义。
:
: 相当于你同一个变量定义了两次,编译器肯定要报错,至于报static function可能是编译器回溯错误类型的问题。
--
FROM 116.169.10.*
你都告诉编译器this的类型了,然后还要求编译器不要使用这个this类型。this就是一个变量名称,和普通变量名称没什么区别。
同名变量的处理规则,编译器早有固定的规则,你非要搞成同名的,还要求编译器再自创一套新规则。
【 在 allegro 的大作中提到: 】
: 我们无论如何不会/不该尝试在lambda函数体内访问lambda的this。这应该是编译器支持deduce this的bug。
: - 来自 水木社区APP v3.5.7
: 【 在 ziqin 的大作中提到: 】
: ...................
--来自微微水木3.5.17
--
FROM 183.193.18.*
deducing this正确的命名方式应该是 this auto varname
你那个写法 直接连变量名都省略了 能正常有鬼了
不信你给deducing this一个变量名 看看会不会有问题
【 在 allegro 的大作中提到: 】
: 我们无论如何不会/不该尝试在lambda函数体内访问lambda的this。这应该是编译器支持deduce this的bug。
: - 来自 水木社区APP v3.5.7
--
FROM 36.21.11.*
现在lambda都可以这么写了吗? 捕获this的时候, 不需要首先指定&, 还是=?
this auto 是什么写法?
我感觉我老了.
【 在 allegro 的大作中提到: 】
: void A::f()
: {
: auto fn = [this](this auto){
: ...................
--
FROM 120.244.224.*
原来不是只有我懵逼啊
【 在 hyperLee 的大作中提到: 】
: 现在lambda都可以这么写了吗? 捕获this的时候, 不需要首先指定&, 还是=?
: this auto 是什么写法?
: 我感觉我老了.
: ...................
--
FROM 114.249.19.*
这和变量名无关的。
- 来自 水木社区APP v3.5.7
【 在 ziqin 的大作中提到: 】
: deducing this正确的命名方式应该是 this auto varname
:
: 你那个写法 直接连变量名都省略了 能正常有鬼了
:
: 不信你给deducing this一个变量名 看看会不会有问题
--
FROM 112.44.194.*

