代码之家  ›  专栏  ›  技术社区  ›  ksl

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

  •  0
  • ksl  · 技术社区  · 6 年前

    请考虑以下代码段:

    #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
    

    但是声明 iter2 可以.

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

    1 回复  |  直到 6 年前
        1
  •  10
  •   Rakete1111    6 年前
    [&(target.first)](float item) {
        return std::fabs(item - target.first) < 0.1f;
    }
    

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

    [&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;
    }