ホームページ > バックエンド開発 > C++ > C 14 で Lambda より `std::bind` を優先する必要があるのはどのような場合ですか?

C 14 で Lambda より `std::bind` を優先する必要があるのはどのような場合ですか?

Barbara Streisand
リリース: 2024-12-23 09:09:34
オリジナル
424 人が閲覧しました

When Should You Prefer `std::bind` Over Lambdas in C  14?

C 14 でラムダより std::bind を検討する理由

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&amp;&amp; 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート