C 11 の "auto" を使用したラムダ演繹の型の探索
ラムダの型は関数ポインターであるという誤解に反して、最近のテストで予期せぬ結果が判明しました。ラムダ式を関数ポインターと「auto」変数の両方に代入しようとすると、アサーションは失敗します。これにより、「auto」キーワードで推定されたラムダの本当の型は何なのかという疑問が生じます。
明確にするために、ラムダ式は事実上、ファンクターの構文上のショートカットです。コンパイル中に、ラムダはファンクター オブジェクトに変換されます。 [] 括弧内の要素はコンストラクター パラメーターとファンクター メンバー変数になりますが、() 括弧内のパラメーターはファンクターの Operator() パラメーターに変換されます。
驚くべきことに、ラムダは変数をキャプチャしません (つまり、変数内に要素がないラムダ)。 []) は関数ポインターに変換できます (ただし、この変換は MSVC2010 ではサポートされていません)。ただし、ラムダの組み込み型は未指定のファンクター型のままであることを強調することが重要です。
提供されたコード例では、ラムダ式 LAMBDA は最初に関数ポインター pFptr に割り当てられ、次に「auto」に割り当てられます。 " 変数 pAuto.後続のアサーションは、pFptr と pAuto の型が等しいことを検証し、実際に合格します。これは、「auto」キーワードがラムダの型を関数ポインターであると正常に推定し、pFptr へのシームレスな代入を可能にしていることを示しています。
それにもかかわらず、重要なポイントは、ラムダは本質的には指定されていないファンクター型であるということです。関数ポインターにキャストできる機能。この違いは、最新の C プログラミングにおけるラムダ式の柔軟性と複雑さを強調しています。
以上が「auto」は C 11 ラムダ式に対してどのような型を推定しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。