簡體   English   中英

無法通過引用捕獲Lambda中的成員變量

[英]Can't capture a member variable in a lambda by reference

考慮以下代碼片段:

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

有人可以解釋為什么第一個聲明不編譯嗎?

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

您不能執行[&(target.first)] 即使沒有括號,您也無法捕獲這樣的單個成員變量。 您需要使用C ++ 14的捕獲init:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM