Lambda Expression


Lambda Expression ?


関数オブジェクトの名前が付いていません
暗黙関数
回収不可能な使い捨て関数を簡単に作成する方法

構成

[Capture](Parameter) <specifier> -> <return_type>
{
  <body>
}

capture


[]で外部変数の取得方法を指定します.
int x = 1;
int y = 2;

[](){ std::cout << "No captureing" << std::endl; };
[=]() { return x > y ? x : y }; // 값에 의한 캡쳐 
[=]() { x = 3 }; // 값 캡쳐 방식 -> 값을 바꿀 수 없다.

[&]() { x = 3; }; // 참조 캡처 방식 -> 값 변경 가능

[x]() { std::cout << x << std::endl; }; // 특정 값 캡쳐
[x]() { std::cout << x << y << std::endl; }; // 특정 값 캡쳐

[=, &y]() // 혼합 방식
{
  y = 3;
  std::cout << x << y << std::endl;  
}

parameter

[] { std::cout << "lol" << std::endl; } // () 생략 가능
auto myFunc = [] (int x, int y) { return x + y; };
myFunc(a, b);

specifier


mutable


値ベースのスナップオブジェクトを変更できます.
良い言語設計や既存のC++方式とは逆です.
[x]() mutable { std::cout << ++x << endl; };

return_type


返還刑を指定する.
少なくとも私はあなたに類比をあげます.

短所


デバッグ
  • は難しい->関数名がありません.
  • 関数は再利用性が低い.
  • 人は通常、関数名を検索することによって既存の機能を推定する.
  • Best Practice

  • デフォルトでは、名前付き関数
  • が使用されます.
  • 行の小さな関数はramです.
  • sortのようにパラメータ伝達関数はramである.