Comment fonctionne lambda générique ( auto
mot-clé comme type d'argument) dans la norme C ++ 14?
Est-il basé sur des modèles C ++ où pour chaque type d'argument différent, le compilateur génère une nouvelle fonction avec le même corps mais des types remplacés (polymorphisme à la compilation) ou est-il plus similaire aux génériques de Java (effacement de type)?
Exemple de code:
auto glambda = [](auto a) { return a; };
Réponses:
Les lambdas génériques ont été introduits dans
C++14
.Simplement, le type de fermeture défini par l'expression lambda aura un opérateur d'appel basé sur un modèle plutôt que l'opérateur d'appel normal et non modèle
C++11
des lambdas de s (bien sûr, lorsqu'ilauto
apparaît au moins une fois dans la liste de paramètres).Donc votre exemple:
Fera
glambda
une instance de ce type:Le paragraphe 5.1.2 / 5 du projet de norme C ++ 14 n3690 spécifie comment l'opérateur d'appel du type de fermeture d'une expression lambda donnée est défini:
Finalement:
Comme l'explique le paragraphe ci-dessus, les lambdas génériques ne sont que du sucre syntaxique pour des foncteurs uniques et sans nom avec un opérateur d'appel basé sur un modèle. Cela devrait répondre à votre question :)
la source
int main () { struct X {}; std::vector<X> x; }
)Malheureusement , ils ne font pas partie de C ++ 11 ( http://ideone.com/NsqYuq ):
Avec g ++ 4.7:
Cependant , la façon dont il pourrait être implémenté en C ++ 14 selon la proposition de Portland pour les lambdas génériques :
Cela donnerait pour l'essentiel la création habituelle d'une classe de foncteurs anonyme, mais avec le manque de types, le compilateur émettrait un membre basé sur un modèle
operator()
:Ou selon la nouvelle proposition Proposition d'expressions lambda génériques (polymorphes)
Alors oui, pour chaque permutation de paramètres, une nouvelle instanciation se produirait, cependant, les membres de ce foncteur seraient toujours partagés (c'est-à-dire les arguments capturés).
la source
-std=c++1y
.auto
a les mêmes règles de déduction que l'automobile classique? Si nous nous référons à l'analogie basée sur un modèle, cela signifierait que l'auto n'est pas automatique, ce sont les mêmes règles que la déduction de type de modèle. La question est alors: la déduction de modèle est-elle équivalente àauto
?static
ouregister
:) Quoi qu'il en soit, oui, l'utiliserauto
signifie que sous le capot, un modèle normal est généré. En fait, un lambda sera remplacé en interne par une classe de foncteur, et unauto
paramètre signifie qu'iltemplate <T> ... (T ...)
sera émis.C'est une fonctionnalité proposée en C ++ 14 (pas en C ++ 11) similaire (ou même équivalente) aux modèles. Par exemple, N3559 fournit cet exemple:
la source