ポジティブ ラムダ: ' []{}' - 予期せぬことを掘り下げる
ラムダ式の謎めいた性質を調査する試み、「ラムダの再定義は C 11 では許可されていません。なぜですか?」という質問。起きた。 Johannes Schaub による奇妙な発見により、最初のラムダの前に単項演算子を追加するとコンパイルできることが明らかになりました。
クエリ:
なぜ次のコードはエラーなしでコンパイルできるのでしょうか。 :
int main() { auto test = +[]{}; // Note the unary operator + before the lambda test = []{}; }
この動作は C に従っていますか標準?
お披露目:
はい、コードは C 標準に準拠しています。この演算子は、ラムダからプレーンな関数ポインターへの変換を見事にトリガーします。
展開:
コンパイラーは、初期ラムダ ([]{}) を解釈し、クロージャーオブジェクト。このラムダは変数をキャプチャしないため、クロージャ オブジェクトを、クロージャの関数呼び出し演算子と同じパラメータと戻り値の型を持つ関数ポインタに変換する変換関数が存在します。
この変換は、単項関数の要件と一致します。オペレーター。の組み込みオーバーロードには、任意の型 T を T へのポインターに変換するオーバーロードが含まれます。クロージャ型は、関数ポインターへの変換を提供することでこの要件を満たします。
したがって、式 auto test = []{ };テストのタイプは void(*)() であると推定されます。これにより、2 行目での後続の代入が有効になり、2 番目のラムダ/クロージャ オブジェクトも関数ポインターへの変換が行われ、互換性のある代入が行われます。
意味:
この異常な動作は、ラムダ式の多用途性と C 言語の複雑なメカニズムを浮き彫りにします。ラムダ式を関数ポインターに変換することでラムダ式の再代入が可能になり、柔軟性とコード最適化の可能性が提供されます。
以上がC で単項演算子 ' ' を追加すると Lambda の再代入が可能になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。