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

Ser*_*zer 3 c++ lambda c++11

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

Constructor(const vector<string>& names) {
  for_each(names.begin(), names.end(),
                     [this, counter = 1](const String& choice) mutable {
                            nameMapping.emplace(choice, counter++);
                        }
  );
}
Run Code Online (Sandbox Code Playgroud)

我没有真正理解的是如何counter工作?

仅供参考:counter在 lambda 函数之外无处声明。

但是,我能够在类范围中创建一个局部变量并在可变的 lambda fn 中修改它吗?

有人可以帮助我了解发生了什么。

Ale*_*ley 5

当您设置时,counter = 1您将声明一个新的临时值counter等于 1。编译器完成确定类型的工作。int默认情况下,这个临时对象被推导为类型,并在 lambda 存在时存在。

通过设置,mutable您可以修改counterthis

旁白:由于您似乎正在插入地图/无序地图,因此您最好使用以下内容:

#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);
}
Run Code Online (Sandbox Code Playgroud)

通过将 nameMapping 调用移到 lambda 之外,您不必将自己与范围内的内容和范围外的内容混淆。

此外,您可以避免不必要的捕获,以及将来可能使您或其他读者感到困惑的任何其他内容。