请考虑以下代码段:
#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 编译失败,出现以下错误:
iter1
error: expected ',' before '(' token
但是声明 iter2 可以.
iter2
有人能解释为什么第一个声明不能编译吗?
[&(target.first)](float item) { return std::fabs(item - target.first) < 0.1f; }
你不能这么做 [&(target.first)] . 即使没有括号,也无法捕获这样的单个成员变量。您需要使用C++ 14的捕获子表达式:
[&(target.first)]
[&first = target.first](float item) { return std::fabs(item - first) < 0.1f; }
或者,跟随第二个lambda,捕捉 target :
target
[&target](float item) { return std::fabs(item - target.first) < 0.1f; }