ホームページ >バックエンド開発 >C++ >' ' 演算子は C の非キャプチャーラムダでどのように動作しますか?

' ' 演算子は C の非キャプチャーラムダでどのように動作しますか?

DDD
DDDオリジナル
2024-12-22 18:21:14349ブラウズ

How Does the ' ' Operator Work with a Non-Capturing Lambda in C  ?

ポジティブなラムダ: ' []{}' - 明かされる秘密

C コーディングの領域では、ラムダに適用される ' ' 演算子の動作(' []{}') は好奇心を呼び起こしました。このコードは型破りに見えますが、驚くべきことに主要なコンパイラで正常にコンパイルできます。しかし、この標準に対する例外はどのように機能するのでしょうか?

関数ポインターへの変換

この動作を理解する鍵は、' ' 演算子のオーバーロードにあります。ラムダに適用すると、「 」は単純な古い関数ポインタへの変換をトリガーします。これは、問題のラムダが非キャプチャリングであるため、つまり外部変数を参照しないため可能です。

C 標準 (セクション 5.1.2) によれば、非キャプチャリング ラムダ クロージャ オブジェクトには次のような特徴があります。関数ポインタを返すパブリックの非仮想変換関数。このポインターは、ラムダと同じ動作を持つ関数を指します。

組み込み演算子のオーバーロード

「 」演算子には、任意の型をポインターに変換する組み込みオーバーロードがあります。 。ラムダの場合、前述の変換関数がオーバーロードの候補として選択されます。結果は、ラムダの関数呼び出し演算子と同じパラメーターと戻り値の型の関数ポインターです。

したがって、「 」が最初のラムダに適用されると、ラムダ クロージャ オブジェクトが関数ポインターに変換されます。これにより、両方のラムダに互換性のある型があるため、2 番目のラムダ クロージャ オブジェクトを同じ関数ポインタに割り当てることが可能になります。

標準準拠

はい、' []{}' を使用したコードは次のとおりです。規格適合。 C 標準では、非キャプチャ ラムダ クロージャ オブジェクトを関数ポインタに変換できます。この動作により、驚くべきだが有効なコーディング トリックが可能になります。

以上が' ' 演算子は C の非キャプチャーラムダでどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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