簡體   English   中英

C ++ 11 lambda表達式 - Capture vs Argument Passing

[英]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的預期用途,仍然......

  1. 為什么第一個總是返回true?
  2. 為什么第二次無法編譯?

為什么第一個總是返回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.

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