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