【C++】ラムダ式
C++ における関数オブジェクト
struct PlusOne { auto operator() (int x) const -> int { return x + 1; } }; PlusOne plusOne = {}; std::cout << plusOne(0) << std::endl; // 1
ラムダ式の値は、匿名の関数オブジェクトである
auto lambda_0 = [](int x)->int{ return x + 1; }; std::cout << lambda_0(0) << std::endl; // 1
複数引数
auto lambda_1 = [](int x, int y)->int{ return x + y; }; std::cout << lambda_1(1, 2) << std::endl; // 3
無引数
auto lambda_2 = []()->int{ return 1; }; std::cout << lambda_2() << std::endl; // 1
void 返却
auto lambda_3 = [](int x)->void{ std::cout << x << std::endl; }; lambda_3(1); // 1
型推論(戻り値)
auto lambda_4 = [](){ return 1; }; std::cout << lambda_4() << std::endl; // 1
return が無い場合は void と推論される
auto lambda_5 = [](int x){ std::cout << x << std::endl; }; lambda_5(1); // 1
(引数)->戻り値 の推論
auto lambda_6 = []{ return 1; }; std::cout << lambda_6() << std::endl; // 1
C++11 では、ラムダ式本体が { return 式; } でない限り型推論は不可能だが、
C++14 では、その制限が撤廃され以下の式が成り立つ
C++14 では、auto を使うことで引数に対しても型推論が行える
複数の return での型は一致していなければコンパイルエラー
auto lambda_7 = [](double x) { if (x < 0){ return std::numeric_limits<double>::quiet_NaN(); } else { return std::sqrt(x); } };
グローバル変数や constexpr (C++14)で装飾された変数は式中で使用可能
constexpr int n = 1; auto lambda_8 = []{ std::cout << n << std::endl; }; lambda_8(); // 1
キャプチャについて
大切なことは下記URLで紹介されているので参照必須!
参照:C++14 のラムダ式 完全解説 中編 - 野良C++erの雑記帳