ホームページ  >  記事  >  バックエンド開発  >  Lambda 関数の変数を明示的にキャプチャしてコンパイル エラーを解決するにはどうすればよいですか?

Lambda 関数の変数を明示的にキャプチャしてコンパイル エラーを解決するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-23 18:23:01743ブラウズ

How to Explicitly Capture Variables in Lambda Functions to Resolve Compilation Errors?

Lambda 関数の変数のキャプチャ

関数呼び出し内でラムダ式を利用する場合、それを囲んでいるスコープから変数をキャプチャすることが不可欠です。このコンテキストでは、変数を暗黙的にキャプチャできないと、悪名高い「エラー C3493: '変数 "を暗黙的にキャプチャできません...'」などのコンパイル エラーが発生する可能性があります。

次のコード スニペットを検討してください。

<code class="cpp">int flagId = _ChildToRemove->getId();
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [](Flag& device) { return device.getId() == flagId; });

m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end());</code>

このコードは、ラムダ関数を使用して C のベクトルから要素を削除しようとします。ラムダは、ベクトル m_FinalFlagsVec 内の各デバイスの ID フィールドを、削除されるデバイスの ID である外部変数 flagId と比較します。

ただし、コンパイラは前述のエラーを発生させ、flagId 変数がラムダのキャプチャ リストに含まれていないことを示します。この問題を解決するには、囲んでいるスコープからキャプチャする変数を明示的に指定する必要があります。

<code class="cpp">[flagId](Flag& device)
{
    return device.getId() == flagId;
}</code>

キャプチャ リストに flagId を含めることで、ラムダが外側のスコープから flagId 変数にアクセスすることを示します。

  • 値による: 変数はラムダのクロージャにコピーされ、ラムダ内で不変になります。

    <code class="cpp">[flagId = std::as_const(flagId)](Flag& device)
    {
      // flagId is immutable within the lambda
    }</code>
  • 参照による: 変数ラムダ内で直接参照され、変更が可能です。

    <code class="cpp">[&flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
  • 可変参照による: 参照によるキャプチャと似ていますが、ラムダはキャプチャされたものを変更できます。 variable.

    <code class="cpp">[mutable flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>

適切なキャプチャ モードの選択は、ラムダ関数の特定の要件によって異なります。囲んでいるスコープから変数を明示的にキャプチャすることで、開発者はラムダ式内のデータを効果的に処理でき、コードが機能し、バグがない状態を維持できるようになります。

以上がLambda 関数の変数を明示的にキャプチャしてコンパイル エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。