c++ - lambda教學 - lambda expression好處




C++ 11 lambda捕獲通過值捕獲在聲明點 (2)

下面的代碼打印0,但我期望看到一個1.我的結論是,lambda函數不是通過實際將捕獲的參數傳遞給函數來調用,這更直觀。 我是對的還是我錯過了什麼?

#include <iostream>
int main(int argc, char **argv){
  int value = 0;
  auto incr_value  = [&value]() { value++; };
  auto print_value = [ value]() { std::cout << value << std::endl; };
  incr_value();
  print_value();
  return 0;
}

問題是你的打印功能是通過值來捕獲,而不是通過引用。

#include <iostream>
int main(int argc, char **argv){
  int value = 0;
  auto incr_value  = [&value]() { value++; };
  auto print_value = [ value]() { std::cout << value << std::endl; };
  auto print_valueref = [ &value]() { std::cout << value << std::endl; };

  incr_value();
  print_value();
  print_valueref();
  return 0;
}

按預期輸出0和1。 第一個是按值捕獲,並在捕獲點打印值; 第二個捕獲參考,然後打印它的值。


是的,捕獲是在lambda聲明的時候完成的,而不是在被調用時完成的。 把lambda看作是一個函數對象,它的構造函數將捕獲的變量作為參數,並將它們賦值給它相應的成員變量(取值或引用,取決於捕獲模式).Lambda的實際調用沒有魔力,它只是一個定期調用底層函數對象的operator()方法。

在調用點捕獲事物沒有多大意義 - 如果將lambda返回或作為參數傳遞給另一個函數並在那裡調用,會捕獲什麼? 實際上有這樣的語言 - 如果你在一個函數中引用一個變量x ,則假定它指向調用點範圍內的任何稱為x變量。 這被稱為動態範圍界定。 大多數語言都使用這種替代方法,因為它使程序的推理更加簡單,稱為詞法範圍界定(lexical scoping)。

http://en.wikipedia.org/wiki/Lexical_scoping#Lexical_scoping_and_dynamic_scoping





c++11