C 11 のラムダ式の型推定
C 11 では、ラムダ式は匿名関数を作成するための多用途ツールです。ただし、その基礎となる型推論メカニズムは必ずしも直観的であるとは限りません。
コード スニペットを考えてみましょう。
#define LAMBDA [] (int i) -> long { return 0; } int main() { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! }
このコードは、ラムダ式を関数ポインターと auto 変数の両方に割り当てます。ただし、それらの型を比較するアサーションは失敗します。ここで疑問が生じます: auto を使用して推定した場合のラムダ式の本当の型は何ですか?
予想されるものとは異なり、ラムダ式には本質的に関数ポインタ型がありません。代わりに、ファンクター オブジェクトに変換されます。 [] 括弧内のすべてのものはコンストラクターの引数とファンクターのメンバーになりますが、() 内のパラメーターはファンクターの Operator() パラメーターになります。
変数をキャプチャしないラムダ式 (空の [] 括弧) は関数に変換できます。ポインタ。ただし、ラムダ自体の基になる型はファンクター型のままであり、関数ポインターと必ずしも同じであるとは限りません。
したがって、pFptr の型が関数ポインターであるため、コード スニペットのアサーションは失敗します。一方、pAuto の型は、ラムダ式によって生成されたファンクター型です。
以上がC 11 ラムダ式の「自動」推論が関数ポインタの型と異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。