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