[C++] Qual è il tipo di lambda quando dedotto con "auto" in C ++ 11?


Answers

È una struttura unnamed unica che sovraccarica l'operatore di chiamata di funzione. Ogni istanza di una lambda introduce un nuovo tipo.

Nel caso speciale di una lambda non catturante, la struttura in aggiunta ha una conversione implicita in un puntatore di funzione.

Question

Ho avuto la percezione che, il tipo di lambda è un puntatore a funzione. Quando ho eseguito il test successivo, ho trovato che fosse sbagliato ( demo ).

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

Il codice sopra manca qualsiasi punto? In caso contrario, qual è il typeof espressione lambda quando viene dedotta con auto parola chiave auto ?




#include <iostream>
#include <typeinfo>

#define LAMBDA [] (int i)->long { return 0l; }
int main ()
{
  long (*pFptr)(int) = LAMBDA;  // ok
  auto pAuto = LAMBDA;  // ok

  std::cout<<typeid( *pAuto ).name() << std::endl;
  std::cout<<typeid( *pFptr ).name() << std::endl;

  std::cout<<typeid( pAuto ).name() << std::endl;
  std::cout<<typeid( pFptr ).name() << std::endl;
}

I tipi di funzione sono effettivamente uguali, ma la lambda introduce un nuovo tipo (come un functor).




Dovrebbe anche notare che lambda è convertibile in puntatore a funzione. Tuttavia, typeid <> restituisce un oggetto non trittico che dovrebbe differire da lambda al puntatore di funzione generico. Quindi il test per typeid <> non è un'ipotesi valida. In generale, C ++ 11 non vuole che ci preoccupiamo delle specifiche del tipo, tutto ciò che importa se un determinato tipo è convertibile in un tipo di destinazione.