備忘録

プログラムやゲーム関連に関すること

【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

型推論(戻り値)

型推論での型は参照や const の付かない型になる

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

引用:C++14 のラムダ式 完全解説 前編 - 野良C++erの雑記帳

キャプチャについて

大切なことは下記URLで紹介されているので参照必須!
参照:C++14 のラムダ式 完全解説 中編 - 野良C++erの雑記帳