Quel est le type de lambda quand déduit avec “auto” en C++11?
J'ai eu l'impression que, le type d'une expression lambda est un pointeur de fonction. Lorsque j'ai effectué les test suivant, je l'ai trouvé mauvais (démo).
#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 !
}
Est au-dessus de code manquant tout point ? Si non, alors, qu'est-ce que le typeof
une expression lambda quand déduit auto
mot-clé ?
- “le type d'une expression lambda est un pointeur de fonction” – qui serait inefficace et manquer le point de l'ensemble des lambdas.
Vous devez vous connecter pour publier un commentaire.
Le type d'une expression lambda est indéterminé.
Mais ils sont en général de simples sucre syntaxique pour les foncteurs. Un lambda se traduit directement par un foncteur. Rien à l'intérieur de la
[]
sont activées dans les paramètres du constructeur et les membres du foncteur de l'objet, et les paramètres à l'intérieur de()
sont activées dans les paramètres pour le foncteur deoperator()
.Un lambda qui capte l'absence de variables (rien à l'intérieur de la
[]
's) peut être converti dans un pointeur de fonction (MSVC2010 ne supporte pas cela, si c'est votre compilateur, mais cette conversion est la partie de la norme).Mais le type réel de l'lambda n'est pas un pointeur de fonction. C'est une quelconque foncteur type.
operator()
fondamentalement stackoverflow.com/questions/356950/c-functors-and-their-usesC'est un unique sans nom de la structure qui les surcharges de l'opérateur d'appel de fonction. Chaque instance d'un lambda introduit un nouveau type.
Dans le cas particulier d'un non-capture lambda, la structure en plus a une conversion implicite d'un pointeur de fonction.
type_info::name()
la mise en œuvre est définie, de sorte qu'il peut retourner quoi que ce soit. Dans la pratique, le compilateur nom d'un type pour le bien de l'éditeur de liens.La clause énumère diverses propriétés de ce type. Voici quelques faits saillants:
La conséquence de ce dernier passage, c'est que, si vous avez utilisé une conversion, vous serez en mesure d'attribuer
LAMBDA
àpFptr
.Les types de fonctions sont en effet les mêmes, mais le lambda introduit un nouveau type (comme un foncteur).
__PRETTY_FUNCTION__
, comme danstemplate<class T> const char* pretty(T && t) { return __PRETTY_FUNCTION__; }
, et de dépouiller le plus si il commence à y avoir du monde. Je préfère voir les étapes indiquées dans le modèle de substitution. Si vous êtes absent__PRETTY_FUNCTION__
, il existe des alternatives pour MSVC, etc., mais les résultats sont toujours compilateur-dépendants pour la même raison CXXABI est nécessaire.Il convient également de noter que la lambda est convertibles en un pointeur de fonction. Cependant typeid<> retourne un non-trvial objet qui doit différer de lambda générique pointeur de fonction. Donc, le test pour typeid<> n'est pas une hypothèse valable. En général C++11 ne voulez pas à vous soucier du type de spécification, tout ce qui importe si un type donné est convertible à un type de cible.
Une solution pratique à partir de Comment puis-je stocker un boost::bind objet en tant que membre de la classe?, essayez
boost::function<void(int)>
oustd::function<void(int)>
.