C ++11モードのGCC4.7では、ラムダをとる関数を2つの異なる方法で定義できます。
// by value
template<class FunctorT>
void foo(FunctorT f) { /* stuff */ }
と:
// by r-value reference
template<class FunctorT>
void foo(FunctorT&& f) { /* stuff */ }
だがしかし:
// by reference
template<class FunctorT>
void foo(FunctorT& f) { /* stuff */ }
関数のテンプレートを解除して、代わりにstd ::関数を使用できることはわかっていますが、foo
小さくインラインであるため、コンパイラーが内部で行うfの呼び出しをインライン化するための最良の機会を提供したいと思います。最初の2つのうち、ラムダを渡すことが明確にわかっている場合はパフォーマンスに適していますが、最後の1つにラムダを渡すことが許可されないのはなぜですか?