C 14 では強力なラムダ式が導入され、std::bind の継続的な関連性に疑問を抱く人もいます。ラムダは簡潔な構文を提供しますが、std::bind は特定の分野でその有用性を維持します。
移動できないキャプチャ変数:
C 11 では、ラムダは左辺値変数のみをキャプチャできますが、バインドでは変数の移動が可能です。バインドを通じて、次のコードを作成できます。
auto f1 = std::bind(f, 42, _1, std::move(v));
式のキャプチャ:
ラムダは式を直接キャプチャできません。代わりに、バインドでは次のように記述できます:
auto f1 = std::bind(f, 42, _1, a + b);
パラメーターをオーバーロードする関数オブジェクト:
C 14 では、ラムダは型推論を通じてこの問題を解決し、ここでバインドできます。現場で。
パラメータを渡すことができません:
理想的には、完全転送を使用する必要があるバインドは次のコードのように記述できます:
auto f1 = [=](auto&& arg) { f(42, std::forward<decltype(arg)>(arg)); };
ただし代わりに、バインドは次の形式にブロックします:
auto f1 = std::bind(std::declval<decltype(f)>(), 42, _1); auto f2 = std::bind(f, 42, std::declval<decltype(arg)>(), std::placeholders::_2);
バインドの欠点:
それでも、バインドには依然として利点があります。 lambda は関数オブジェクト型のみを生成しますが、lambda は関数ごとに一意の型を生成する場合があります。最終的に、バインドまたはラムダの選択は、特定のユースケースとトレードオフによって異なります。
以上がC 14 で Lambda より `std::bind` を優先する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。