C コーディングの領域では、ラムダに適用される ' ' 演算子の動作(' []{}') は好奇心を呼び起こしました。このコードは型破りに見えますが、驚くべきことに主要なコンパイラで正常にコンパイルできます。しかし、この標準に対する例外はどのように機能するのでしょうか?
この動作を理解する鍵は、' ' 演算子のオーバーロードにあります。ラムダに適用すると、「 」は単純な古い関数ポインタへの変換をトリガーします。これは、問題のラムダが非キャプチャリングであるため、つまり外部変数を参照しないため可能です。
C 標準 (セクション 5.1.2) によれば、非キャプチャリング ラムダ クロージャ オブジェクトには次のような特徴があります。関数ポインタを返すパブリックの非仮想変換関数。このポインターは、ラムダと同じ動作を持つ関数を指します。
「 」演算子には、任意の型をポインターに変換する組み込みオーバーロードがあります。 。ラムダの場合、前述の変換関数がオーバーロードの候補として選択されます。結果は、ラムダの関数呼び出し演算子と同じパラメーターと戻り値の型の関数ポインターです。
したがって、「 」が最初のラムダに適用されると、ラムダ クロージャ オブジェクトが関数ポインターに変換されます。これにより、両方のラムダに互換性のある型があるため、2 番目のラムダ クロージャ オブジェクトを同じ関数ポインタに割り当てることが可能になります。
はい、' []{}' を使用したコードは次のとおりです。規格適合。 C 標準では、非キャプチャ ラムダ クロージャ オブジェクトを関数ポインタに変換できます。この動作により、驚くべきだが有効なコーディング トリックが可能になります。
以上が' ' 演算子は C の非キャプチャーラムダでどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。