closure - kzono/Cxx_1x GitHub Wiki

クロージャとしてのラムダ関数

C++のラムダ関数は、ラムダ関数を呼び出した関数のローカル変数をキャプチャできる。

しかし、ラムダ関数内で値を利用したいだけならば、ラムダ関数の引数として渡せばよい。キャプチャする変数(自由変数と呼ぶらしい)と引数と使い分ける基準は何か?

ラムダ関数は、別の関数への引数として渡されることがよくある。この場合、キャプチャ変数としてどんなものを渡すべきなのか?

#include <iostream>

int main(){
    int count = 0;
    auto countUp = [&](){
        count++;
        std::cout << count << std::endl;
    };
    countUp(); // 1
    countUp(); // 2
    countUp(); // 3
}

クロージャのメリット

Wikipedia によれば

  • グローバル変数の削減
  • コールバック関数記述の簡素化

となっている。また、関数型言語では

  • 遅延評価
  • カプセル化

のために使われる、と記述されている。引数では実現できず、呼び出し側関数のローカル変数をキャプチャすることで実現できる、とは具体的にどんな場合なのか?

⚠️ **GitHub.com Fallback** ⚠️