auto
était un mot-clé que le C++ avait "hérité" du C, qui existait depuis presque toujours, mais qui n'était pratiquement jamais utilisé parce qu'il n'y avait que deux conditions possibles : soit il n'était pas autorisé, soit il était supposé par défaut.
L'utilisation de auto
pour signifier un type déduit était nouveau avec C++11.
En même temps, auto x = initializer
déduit le type de x
du type de initializer
de la même manière que la déduction du type de modèle fonctionne pour les modèles de fonction. Considérons un modèle de fonction comme celui-ci :
template<class T>
int whatever(T t) {
// point A
};
Au point A, un type a été attribué à T
en fonction de la valeur passée pour le paramètre à whatever
. Lorsque vous le faites auto x = initializer;
la même déduction de type est utilisée pour déterminer le type de x
du type de initializer
qui est utilisé pour l'initialiser.
Cela signifie que la plupart des mécanismes de déduction de type qu'un compilateur doit implémenter auto
étaient déjà présents et utilisés pour les modèles dans tous les compilateurs qui ont essayé d'implémenter C++98/03. En tant que tel, l'ajout du support pour auto
a été apparemment assez facile pour la plupart des équipes de compilateurs - il a été ajouté assez rapidement, et il semble qu'il y ait eu peu de bogues liés à lui aussi.
Lorsque cette réponse a été écrite à l'origine (en 2011, avant que l'encre ne sèche sur la norme C++ 11) auto
était déjà assez portable. Aujourd'hui, il est parfaitement portable parmi tous les compilateurs courants. Les seules raisons évidentes de l'éviter seraient si vous devez écrire du code compatible avec un compilateur C, ou si vous avez un besoin spécifique de cibler un compilateur de niche dont vous savez qu'il ne le supporte pas (par exemple, quelques personnes écrivent encore du code pour MS-DOS en utilisant des compilateurs de Borland, Watcom, etc. qui n'ont pas connu de mises à jour significatives depuis des décennies). Si vous utilisez une version raisonnablement actuelle de l'un des compilateurs les plus courants, il n'y a aucune raison de l'éviter.
Les révisions plus récentes de la norme ont ajouté quelques nouveaux endroits qui auto
peut être utilisé. À partir de C++14, vous pouvez utiliser auto
pour le type d'un paramètre d'un lambda :
[](auto s) { return s + 1; }
Il s'agit essentiellement de la même chose que dans l'exemple ci-dessus, même s'il n'utilise pas explicitement l'option template
il s'agit essentiellement d'un modèle qui déduit le type du paramètre et instancie le modèle sur ce type.
C'était suffisamment pratique et utile pour qu'en C++20, la même capacité soit ajoutée aux fonctions normales, et pas seulement aux lambdas.
Mais, comme précédemment, tout cela revient à utiliser le même mécanisme de déduction de type de base que celui dont nous disposons pour les modèles de fonctions depuis C++98. auto
permet de l'utiliser dans un plus grand nombre d'endroits et de manière plus pratique, mais le travail de fond reste le même.
22 votes
Ce n'est pas magique. C'est nouveau ( oh noes, quel mauvais jeu de mots ). Maintenant, l'asynchronisme est l'avenir ( halètement )
2 votes
Voici la référence sur les mots-clés automobiles fr.cppreference.com/w/cpp/language/auto