【问题标题】:Can't capture a member variable in a lambda by reference无法通过引用捕获 lambda 中的成员变量
【发布时间】:2018-07-13 09:46:02
【问题描述】:

考虑以下代码sn-p:

#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的声明是可以的。

谁能解释为什么第一个声明不能编译?

【问题讨论】:

  • @Tyker 我先试过了。同样的错误。

标签: c++ c++11 lambda c++14


【解决方案1】:
[&(target.first)](float item) {
    return std::fabs(item - target.first) < 0.1f;
}

你不能做[&amp;(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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2023-03-03
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多