c++ 11 lambda表达式-捕获与参数传递
C++11 lambda expression - Capture vs Argument Passing
考虑一个比较正整数的函数;函数本身使用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的本意,但是…
- 为什么第一个总是返回true?
- 为什么第二个编译失败?
为什么第一个总是返回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
相关文章:
- 将__device__ lambda 作为参数传递给 __global__ 函数
- 将 lambda 函数作为参数传递C++
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 通过参数传递 lambda(无函数类型模板)
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 是否可以将带有捕获和参数的 lambda 传递给另一个函数?如果是这样,如何?
- Lambda闭包左值可以作为右值参考参数传递
- 在C++17中,lambda是否可以作为模板参数传递
- 如何在C++中将 lambda 表达式作为参数传递
- 如何将 lambda 表达式作为参数传递到可变参数模板类中的 mermber 函数中
- 将带有自动参数的 lambda 传递给另一个函数是否合法
- 将函数的引用和 lambda 表达式作为参数传递时有什么区别?
- 为什么在传递lambda而不是功能指针时不能推断模板参数
- 将 lambda 作为参数传递时的重载函数
- 如何在C++中使用单个模板参数传递两个 lambda 函数
- 将 lambda 作为模板参数传递:实际推导出什么类型
- c++:将带有参数的lambda传递给函数
- 调用从 lambda 作为模板参数传递的成员函数指针会崩溃
- C++将Lambda函数作为类构造函数参数传递
- 如何通过boost::函数参数传递lambda到被覆盖的方法