魔法の " " 演算子の解読: " []{}" ラムダを理解する
複雑な観察では、単一の " " 接頭辞が存在しますC のラムダ式にすると、奇跡的にその再代入が可能になります。この謎めいた魔術により、次のような疑問が生じました。なぜ次のコードはコンパイルに成功するのでしょうか?
int main() { auto test = +[]{}; // The "+" operator casts a lambda to a function pointer test = []{}; }
その答えは、C 標準の不明瞭な深部にあります。 「 」は、ラムダの単純な古い関数ポインターへの変換をトリガーします。ラムダは非キャプチャーであるため、本質的に、同一のシグネチャを持つ関数ポインターへの変換関数を備えています。この変換関数は、C 標準で定義されているように、ラムダの関数呼び出し演算子と同じように動作する関数のアドレスを返します。
単項 " " 演算子は、ラムダによって生成されたクロージャ オブジェクトに適用されると、一連の組み込みオーバーロードを実行します。これらのオーバーロードの 1 つは、任意のポインター型を受け入れ、それを関数ポインターに変換します。したがって、オーバーロード関数の唯一の候補である関数ポインターへのクロージャ型の変換が優先されます。
その結果、「auto test = []{};」の「test」の型が優先されます。は「void(*)()」であると推定されます。この関数ポインタの互換性により、クロージャの型が異なる場合でも、2 番目のラムダ/クロージャ オブジェクトを「テスト」に割り当てることができます。
この知識により、「 []{}」 ラムダの成功の背後にある秘密が明らかになります。ラムダを関数ポインターにキャストすることで、ラムダの再定義の制限が回避され、新しいラムダ オブジェクトを割り当てる機能がロック解除されます。
以上がC で ` []{}` が Lambda の再代入を有効にするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。