ホームページ >バックエンド開発 >C++ >C 11 ラムダ式の「自動」推論が関数ポインタの型と異なるのはなぜですか?

C 11 ラムダ式の「自動」推論が関数ポインタの型と異なるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 17:57:19375ブラウズ

Why Does `auto` Deduction of a C  11 Lambda Expression Differ from its Function Pointer Type?

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 サイトの他の関連記事を参照してください。

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