Inférence de type Lambda avec "auto" en C 11
Le type d'expression lambda en C 11 est sujet à débat, avec certains croyant qu'il s'agit d'un pointeur de fonction. Cependant, considérons la démonstration suivante :
#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 ! }
Ce code contredit l'hypothèse selon laquelle les lambdas ont un type de pointeur de fonction. Alors, quelle est la véritable nature de leur type ?
Dévoilement de la véritable identité des Lambda
Contrairement à la croyance populaire, les expressions lambda ont un type non spécifié. Ce sont simplement des commodités syntaxiques pour les foncteurs. Lors de la compilation, un lambda se transforme en foncteur :
Lambdas sans capture de variable (parenthèses [] vides) peuvent techniquement être convertis en pointeurs de fonction. Cependant, cette conversion n'est pas prise en charge par tous les compilateurs (par exemple, MSVC2010).
Distinction importante
Bien qu'un lambda qui ne capture aucune variable puisse agir comme un pointeur de fonction, son type sous-jacent reste indéterminé. Ce n'est pas un pointeur de fonction mais plutôt un type de foncteur non spécifié.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!