c++ - 更改 c++ lambda 中捕获的变量的值
问题描述
我正在尝试通过引用将捕获的变量增加到 lambda 函数,但无法这样做。
通过按值捕获变量,然后使 lambda 可变,我可以增加该值。但是通过传递引用,增量没有得到应用。
此外,在按值捕获的情况下,如何在对 inc() 的调用中更新值。这类似于 JS 中的闭包吗?
**Capture By reference**
auto inc_count(int x){
return [&x](){
return x++;
};
};
int main()
{
auto inc = inc_count(4);
cout<<inc()<<endl; //32765
cout<<inc()<<endl; //32765
cout<<inc()<<endl; //32765
cout<<inc()<<endl; //32765
return 0;
}
**Capture by value**
auto inc_count(int x){
return [x]()mutable{
return x++;
};
};
int main()
{
auto inc = inc_count(4);
cout<<inc()<<endl; //4
cout<<inc()<<endl; //5
cout<<inc()<<endl; //6
cout<<inc()<<endl; //7
return 0;
}
实际输出:
32765
32765
32765
32765
预期输出:
4
5
6
7
解决方案
在第一个版本中,您正在捕获对函数返回后不存在的变量的引用。在函数返回并且您的代码具有未定义的行为后,您有一个悬空引用。
您可以使用以下内容通过引用进行捕获。
auto inc_count(int& x){
return [&x](){
return x++;
};
};
但是,你不能使用int_count(4)
in main
。您必须使用一个变量,其引用可以在int_count
.
int main()
{
int number = 4;
auto inc = inc_count(number);
...
return 0;
}
推荐阅读
- c# - 如何使组合框可按关键字搜索
- php - 如何将值从存储库传递到 laravel 中的控制器
- laravel - Laravel Blade 中的“::”语法是什么意思(例如:@include('googletagmanager::head'))?
- javascript - 如何在 JSON 数据中搜索动态结果
- django - Django 日志配置在本地服务器上工作,但不在远程服务器上
- node.js - 这个问题 TypeError: callback is not a function
- excel - MS Excel:将日期标准化为一种格式
- react-native - 向上滚动 FlatList 反应原生时如何获取更多数据?
- haskell - Monad中的do符号在Haskell中是什么意思
- swiftui - SwiftUI:未应用对齐