gpt4 book ai didi

c++ - Lambda 捕获意外变量

转载 作者:太空宇宙 更新时间:2023-11-04 14:53:26 25 4
gpt4 key购买 nike

我试图弄清楚 lambda 在 C++ 中是如何工作的。

奇怪的事情发生了。太奇怪了,我不知道如何正确描述它。我尝试用谷歌搜索几个关键字,但没有发现任何提及该行为的内容。

我首先尝试了 this code

#include <iostream>
#include <utility>
using namespace std ;

auto func() {
int a = 0 ;

auto increase = [ &a ]( int i = 1 ){ a += i ; } ;
auto print = [ &a ](){ cout << a << '\n' ; } ;

pair< decltype(increase), decltype(print) >
p = make_pair( increase, print ) ;
return p ;
}

int main() {
auto lambdas = func() ;

auto increase = lambdas.first ;
auto print = lambdas.second ;

print() ;
increase() ;
print() ;
increase( 123456 ) ;
print() ;

return 0;
}

输出符合预期

-1218965939
-1218965938
-1218842482

但是,在我将其添加到“func()”之后

cout << typeid( decltype( print ) ).name() << '\n'
<< typeid( decltype( increase ) ).name() << '\n' ;

喜欢 this one

输出变成了

Z4funcvEUlvE0_
Z4funcvEUliE_
0
1
123457

我没想到会发生。

[更新]

变量 a 应该是“死的”,因为它的生命周期已经结束。

不过我很好奇为什么代码考试typeiddecltype导致a好像复活了?

最佳答案

您正在通过引用绑定(bind)到 a。但这是一个存储在堆栈中的局部变量。一旦函数完成执行,访问它是未定义的行为。

这就好像你返回一个指向a 的指针然后从调用者开始使用它一样。

关于c++ - Lambda 捕获意外变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37264608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com