ホームページ >バックエンド開発 >C++ >C 11 ラムダ式の True Type は何ですか?

C 11 ラムダ式の True Type は何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 10:06:12282ブラウズ

What is the True Type of a C  11 Lambda Expression?

C 11 の "auto" を使用したラムダ型推論

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 !
}

このコードは、ラムダが関数ポインター型を持つという仮定に矛盾します。では、その型の本当の性質は何でしょうか?

ラムダの正体を明らかにする

一般に信じられていることに反して、ラムダ式には不特定の型があります。これらは単にファンクターにとって構文上の便宜を図るためのものです。コンパイル中に、ラムダはファンクターに変換されます。

  • [] 括弧内の要素は、コンストラクター パラメーターおよびファンクター オブジェクト メンバーになります。
  • () で囲まれたパラメーターは、ファンクターの演算子().

変数キャプチャのないラムダ (空の []括弧) は技術的には関数ポインターに変換できます。ただし、この変換はすべてのコンパイラ (MSVC2010 など) でサポートされているわけではありません。

重要な違い

変数をキャプチャしないラムダは関数ポインターとして機能できますが、その基礎となるタイプは未指定のままです。これは関数ポインターではなく、未指定のファンクター型です。

以上がC 11 ラムダ式の True Type は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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