ホームページ >バックエンド開発 >C++ >C 11 では、「auto」がラムダ式の型を関数ポインタとして推定しないのはなぜですか?

C 11 では、「auto」がラムダ式の型を関数ポインタとして推定しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-08 03:59:09295ブラウズ

Why Doesn't `auto` Deduce a Lambda Expression's Type as a Function Pointer in C  11?

C 11 の「auto」によるラムダ型演繹の謎を解く

C 11 の領域では、ラムダ式の導入により疑問が生じています「auto」キーワードを使用して推測されるときの基礎となるタイプに関して。次のコード スニペットに示されているように、ラムダの型が関数ポインターであるという仮定は不正確であることがわかります。

#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」を使用したラムダ式の間の型推論の不一致を示しています。 」というキーワード。興味深いことに、アサーションは失敗し、ラムダの型が関数ポインタではないことが明らかになります。

ラムダ型の本質を明らかにする

この明らかな矛盾を理解するには、次のようにします。 C 11 ではラムダ式の型が未指定のままであることを認識することが重要です。それらは構文として機能します。ファンクターにシームレスに変換される構造。この変換では、角かっこ ("[]") で囲まれた要素はコンストラクターのパラメーターとクラスのメンバーになりますが、かっこ内の要素はファンクターの演算子 () のパラメーターになります。

特に、変数キャプチャ (空の角括弧) は関数ポインターに変換する機能を持っていますが、この機能は MSVC2010 ではサポートされていません。ただし、このような変換は可能ですが、ラムダの固有の型は明確に指定されていないファンクター型であることを強調することが依然として重要です。

結論

" キーワードは型推定に便利ですが、さまざまな言語エンティティの基礎となる型を識別することが不可欠です。ラムダ式の場合、その不特定の性質と関数ポインターへの変換の可能性 (該当する場合) は、C 11 によって提供される柔軟性を強調すると同時に、言語の複雑なニュアンスを理解することの重要性を強調します。

以上がC 11 では、「auto」がラムダ式の型を関数ポインタとして推定しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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