[英]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?
Lambdas衰變為函數指針,它們可以隱式轉換為布爾值(對於lambdas總是true
,因為指針永遠不為null)。
為什么第二次無法編譯?
捕獲任何東西的Lambdas沒有這個轉換為函數指針(該狀態將如何通過?)
如果你必須使用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
最后,值得注意的是, <functional>
中的std::greater
已經這樣做了:
std::sort(…, std::greater<int>()); //std::greater<> in C++14
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.