1. ホーム
  2. c++

[解決済み] C++11で "auto "で演繹した場合のlambdaの型は何ですか?

2022-04-23 18:40:12

質問

ラムダの型は関数ポインタであるという認識を持っていました。以下のテストを行ったところ、間違いであることがわかりました ( デモ ).

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

上記のコードに抜けはありませんか?もしそうでないなら typeof で演繹されるラムダ式です。 auto キーワード ?

どのように解決するのですか?

ラムダ式の型が未指定です。

しかし、一般的にはファンクタのための単なる構文上の糖分である。ラムダは直接ファンクタに変換される。の中にあるものはすべてファンクタに変換されます。 [] の中のパラメータはコンストラクタのパラメータとファンクタオブジェクトのメンバに変わります。 () は、ファンクタの operator() .

変数を捕捉しないラムダ(ambda)。 [] 's) は変換することができます を関数ポインタに変換します (MSVC2010 はこれをサポートしていません。もしお使いのコンパイラがそうなら、この変換は標準の一部です)。

しかし、ラムダの実際の型は、関数ポインタではない。それは不特定のファンクター型である。