无法通过引用捕获 lambda 中的成员变量

Can't capture a member variable in a lambda by reference

本文关键字:lambda 成员 变量 引用      更新时间:2023-10-16

考虑以下代码片段:

#include <map>
#include <string>
#include <set>
#include <algorithm>
#include <cmath>
using TargetsType = std::map<float, std::string>;
using TimesType = std::set<float>;
void foo (const TargetsType& targets,
const TimesType& times)
{
for (const auto& target : targets)
{
// fails to compile
TimesType::const_iterator iter1 = std::find_if(times.begin(),
times.end(),
[&(target.first)](float item) 
{
return std::fabs(item - target.first) < 0.1f;
});
// compiles OK
TimesType::const_iterator iter2 = std::find_if(times.begin(),
times.end(),
[&](float item) 
{
return std::fabs(item - target.first) < 0.1f;
});
}
}

iter1的声明编译失败,出现以下错误:

error: expected ',' before '(' token

但是CCD_ 2的声明是可以的

有人能解释为什么第一个声明没有编译吗?

[&(target.first)](float item) {
return std::fabs(item - target.first) < 0.1f;
}

你不能做[&(target.first)]。即使没有括号,也无法捕获这样的单个成员变量。您需要使用C++14的捕获inits:

[&first = target.first](float item) {
return std::fabs(item - first) < 0.1f;
}

或者,在第二个lambda之后,只捕获target:

[&target](float item) {
return std::fabs(item - target.first) < 0.1f;
}