ホームページ > バックエンド開発 > C++ > 「[]{}」によって C でラムダ式のコンパイルが有効になるのはなぜですか?

「[]{}」によって C でラムダ式のコンパイルが有効になるのはなぜですか?

Barbara Streisand
リリース: 2024-12-24 18:21:18
オリジナル
632 人が閲覧しました

Why Does

ラムダ式を使用した ' ' の謎の解明: ' []{}'

以前の Stack Overflow の質問では、一見単純なラムダ式がコンパイルに失敗しました。ただし、ラムダの前に ' ' 演算子を追加すると、コードは奇跡的にコンパイルできるようになりました。この興味深い観察により、「なぜ ' []{}' は機能するのでしょうか?

鍵は ' ' 演算子のオーバーロード動作にあります。」という疑問が生じます。非キャプチャ ラムダによって生成されたクロージャ オブジェクトに適用されると、クロージャをプレーンな関数ポインタに変換する組み込み変換関数が呼び出されます。

' ' 演算子には候補があるため、この変換は重要です。任意の型をポインターに変換するオーバーロード。したがって、クロージャ オブジェクトに ' ' を適用すると、ラムダへの関数ポインタが生成されます。

最初のラムダが宣言された後の 'test' の型は void(*)() になり、これは次の関数ポインタになります。戻り値の型が void でパラメータがありません。これにより、クロージャの種類が異なっていても、2 番目のラムダを「test」に割り当てることができます。

したがって、コードの機能は次のように説明できます。

  1. 最初のラムダは次のようになります。 ' ' 演算子を使用して関数ポインタに変換されます。
  2. 'test' の型は関数ポインタになりますvoid(*)().
  3. 2 番目のラムダも関数ポインターに変換され、「test」との互換性が保証されます。
  4. 両方の関数ポインターに互換性があるため、「test」への代入は成功します。 .

この動作は C 標準に完全に準拠しており、「[]{}」はラムダにとって有効で驚くほど便利なトリックになります。表現。

以上が「[]{}」によって C でラムダ式のコンパイルが有効になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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