ホームページ >バックエンド開発 >C++ >C で単項演算子 ' ' を追加すると Lambda の再代入が可能になるのはなぜですか?

C で単項演算子 ' ' を追加すると Lambda の再代入が可能になるのはなぜですか?

DDD
DDDオリジナル
2024-12-20 06:38:10218ブラウズ

Why Does Adding a Unary

ポジティブ ラムダ: ' []{}' - 予期せぬことを掘り下げる

ラムダ式の謎めいた性質を調査する試み、「ラムダの再定義は 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 サイトの他の関連記事を参照してください。

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