gpt4 book ai didi

c++ - lambda 函数中的临时捕获变量 - C++11

转载 作者:行者123 更新时间:2023-12-03 07:12:06 29 4
gpt4 key购买 nike

我正在尝试这样的事情来使用字符串的 vector 列表预先填充 map 。
代码是不言自明的:

Constructor(const vector<string>& names) {
for_each(names.begin(), names.end(),
[this, counter = 1](const String& choice) mutable {
nameMapping.emplace(choice, counter++);
}
);
}
我不太明白的是 counter工作?
仅供引用: counter在 lambda 函数之外无处声明。
但是,我能够在类范围中创建一个局部变量并在可变的 lambda fn 中修改它吗?
有人可以帮助我了解发生了什么。

最佳答案

当您设置 counter = 1您正在声明一个新的临时文件 counter等于 1。编译器完成确定类型的工作。这个临时对象被推导出为类型 int默认情况下,并在 lambda 存活时存活。
通过设置 mutable你都可以修改counterthis旁白:由于您似乎要插入 map /无序 map ,因此您最好使用以下内容:

#include <algorithm> // For transform
#include <iterator> // For inserter

Constructor(const vector<string>& names) {
auto const example = [counter = 1](const string& item) mutable {
return {item, counter++};
};
std::transform(names.begin(), names.end(),
std::inserter(nameMapping, nameMapping.end()), example);
}
通过将 nameMapping 调用移到 lambda 之外,您不必将自己与范围内的内容和范围外的内容混淆。
此外,您可以避免不必要的捕获,以及将来可能使您或其他读者感到困惑的任何其他内容。

关于c++ - lambda 函数中的临时捕获变量 - C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64524992/

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