c++ 11 lambda表达式-捕获与参数传递

C++11 lambda expression - Capture vs Argument Passing

本文关键字:参数传递 lambda 表达式 c++      更新时间:2023-10-16

考虑一个比较正整数的函数;函数本身使用lambda来完成这项工作。

// Pass n1, n2 by value to the lambda.
bool Compare(int n1, int n2) {
    return [](int n1, int n2) { return n1 > n2; };
}

上面的代码段可以很好地编译;虽然Compare()总是返回true;

但是,下面的代码甚至无法编译-

// capturing values
bool Compare(int n1, int n2) {
    return [n1, n2]() -> bool { return n1 > n2; };
}

并返回错误

lambda.cpp:48:46: error: cannot convert 'Compare(int, int)::__lambda2' to 'bool' in   return
  return [n1, n2]() -> bool { return n1 > n2; };

可能这些并不是c++中引入lambda的本意,但是…

  1. 为什么第一个总是返回true?
  2. 为什么第二个编译失败?

为什么第一个总是返回true?

lambda衰变成函数指针,函数指针隐式地转换为布尔值(对于lambda总是true,因为指针永远不会为空)。

为什么第二个编译失败?

捕获任何东西的lambda没有这种转换为函数指针(这种状态如何通过?)

如果必须使用lambda:

称之为:

return [](int n1, int n2) { return n1 > n2; }(n1, n2); //notice the () to call it

或者,你的第二种方式,更有意义,但不如return n1 > n2:

return [=] { return n1 > n2; }(); //= captures everything used by value
                                  //-> bool and parameter list are redundant

最后,值得注意的是,std::greater<functional>中已经这样做了:

std::sort(…, std::greater<int>()); //std::greater<> in C++14