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

ksl*_*ksl 0 c++ lambda c++11 c++14

请考虑以下代码段:

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

iter1无法编译的声明,出现以下错误:

error: expected ',' before '(' token
Run Code Online (Sandbox Code Playgroud)

但声明iter2是可以的.

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

Rak*_*111 10

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

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

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

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

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