以前の Stack Overflow の質問では、一見単純なラムダ式がコンパイルに失敗しました。ただし、ラムダの前に ' ' 演算子を追加すると、コードは奇跡的にコンパイルできるようになりました。この興味深い観察により、「なぜ ' []{}' は機能するのでしょうか?
鍵は ' ' 演算子のオーバーロード動作にあります。」という疑問が生じます。非キャプチャ ラムダによって生成されたクロージャ オブジェクトに適用されると、クロージャをプレーンな関数ポインタに変換する組み込み変換関数が呼び出されます。
' ' 演算子には候補があるため、この変換は重要です。任意の型をポインターに変換するオーバーロード。したがって、クロージャ オブジェクトに ' ' を適用すると、ラムダへの関数ポインタが生成されます。
最初のラムダが宣言された後の 'test' の型は void(*)() になり、これは次の関数ポインタになります。戻り値の型が void でパラメータがありません。これにより、クロージャの種類が異なっていても、2 番目のラムダを「test」に割り当てることができます。
したがって、コードの機能は次のように説明できます。
この動作は C 標準に完全に準拠しており、「[]{}」はラムダにとって有効で驚くほど便利なトリックになります。表現。
以上が「[]{}」によって C でラムダ式のコンパイルが有効になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。