keyword:

  • std::function
  • lamda expression
  • putting the return value after the function
  • function object (= a closure)

参考

 

基本

ラムダキャプチャ

[&] : capture all external variable by reference
[=] : capture all external variable by value
[a, &b] : capture a by value and b by reference

ユースケース

ラムダ式を渡して挙動を変える – std::count_if()

ラムダ式をテンプレート引数で渡す

// ラムダ式を引数で受け渡す。柔軟性を持たせるために template parameter としている。
// 型名を書くのが面倒という理由もある。std::function<void()>& を使用しても良い。
template<typename TAllocator>
void* Allocate( size_t size, TAllocator&& Allocator )
{
return Allocator( size );
}

void* LargeSlabAllocator( size_t size )
{
return malloc( size );
}

void* SmallSlabAllocator( size_t size )
{
return malloc( size );
}

実際の使いどころは

 

 

 

その他

ラムダの受け取りに右辺値参照を使用するのはなぜか?

&&を使うかどうかはラムダがtrivially copyableかどうかに依存する。しかし、実際にはラムダのcopyとmoveで違いは無い。capture by valueが無い場合はラムダは普通はtryvially copyable、trivially moveableになる。

 

メモ

申し送り

  • 取り敢えず関数オブジェクトのインスタンスを作ってそれを渡してやればいいんじゃないか?
    関数オブジェクトのコピー、ポインタ渡しのサンプル

     

 

メモ

  • ラムダ式はコンパイラで functor class を作っているとコンセプト的には等価
  • Callable object
  • pointer-to-callable-object
  • ラムダ式の生存期間は?
    • スコープ内で有効だけどもスコープに入る度に new される?
    • スタック領域に確保されるだけ?
    • それともコンパイル時に静的に確保されて利用範囲をスコープ内にきっているだけ?

スコープ内で有効だけどもスコープに入る度に new される?

ラムダ式と関数オブジェクトは等価

下記は等価です。