C++のラムダ式と引数束縛

C++ラムダ式で、コピーキャプチャした場合と参照キャプチャした場合のふるまいの違いを示す。
コピーキャプチャの場合は、ラムダ式が定義された時点での変数の値が使われる。
参照キャプチャの場合は、ラムダ式が実行された時点での変数の値が使われる。

また、std::bindで引数束縛した場合は、束縛した時点での変数の値が使われる。

#include <functional>
#include <stdio.h>

void print(int n) { printf("n = %d\n", n); }

int main()
{
  int n = 10;
  auto hoge = [=] { print(n); }; // コピー
  auto piyo = [&] { print(n); }; // 参照
  auto fuga = std::bind(print, n); // 引数束縛
  n = 20;

  hoge(); // n = 10
  piyo(); // n = 20
  fuga(); // n = 10
}

参考