C ++ mot clé automatique. Pourquoi est-ce magique?

De tout le matériel que j’ai utilisé pour apprendre le C ++, auto a toujours été un spécificateur de durée de stockage étrange qui n’a servi à rien. Mais récemment, j’ai rencontré du code qui l’utilisait comme nom de type en soi. Par curiosité, je l’ai essayé et cela prend le type de ce que je lui atsortingbue!

Soudain, les iterators STL et, bien, tout ce qui utilise des modèles est 10 fois plus facile à écrire. J’ai l’impression d’utiliser un langage «amusant» comme Python.

Où ce mot clé a-t-il été toute ma vie? Voulez-vous anéantir mes rêves en disant que c’est exclusif au studio visuel ou non portable?

auto était un mot-clé que C ++ “héritait” de C qui existait depuis toujours, mais quasiment jamais utilisé car 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 nouvelle avec C ++ 11.

Dans le même temps, auto x = initializer déduit le type de x de l’ initializer type f de la même manière que la déduction de type de modèle fonctionne pour les modèles de fonction. Considérons un modèle de fonction comme celui-ci:

 template int whatever(T t) { // point A }; 

Au point A, un type a été atsortingbué à T fonction de la valeur transmise pour le paramètre. Lorsque vous faites auto x = initializer; , la même déduction de type est utilisée pour déterminer le type de x partir du type d’ initializer utilisé pour l’initialiser.

Cela signifie que la plupart des mécanismes de déduction de type qu’un compilateur doit implémenter sont déjà présents et utilisés pour les modèles sur tout compilateur qui tente même de mettre en œuvre C ++ 98/03. En tant que tel, l’ajout du support pour auto était apparemment assez facile pour pratiquement toutes les équipes du compilateur – il a été ajouté assez rapidement, et il semble y avoir eu peu de bogues non plus.

Lorsque cette réponse a été écrite à l’origine (en 2011, avant que l’encre ne soit sèche sur le standard C ++ 11), l’ auto était déjà très portable. De nos jours, il est complètement portable parmi tous les compilateurs grand public. Les seules raisons évidentes de l’éviter seraient si vous devez écrire du code compatible avec un compilateur C, ou si vous avez besoin de cibler un compilateur de niche qui ne le supporte pas (par exemple, quelques personnes écrivent encore du code). pour MS-DOS utilisant des compilateurs de Borland, Watcom, etc., qui n’ont pas connu de mise à niveau significative depuis des décennies). Si vous utilisez une version raisonnablement actuelle de l’un des compilateurs grand public, il n’y a aucune raison de l’éviter.

Il suffit de prendre un mot-clé généralement inutile et de lui donner une nouvelle fonctionnalité améliorée. Il est standard en C ++ 11, et la plupart des compilateurs C ++ avec même un support C ++ 11 le supporteront.

Cette fonctionnalité n’a pas été là toute votre vie. Il est pris en charge dans Visual Studio depuis la version 2010. C’est une nouvelle fonctionnalité C ++ 11, elle n’est donc pas exclusive à Visual Studio et est / sera portable. La plupart des compilateurs le supportent déjà.

Pour les variables, spécifie que le type de la variable en cours de déclaration sera automatiquement déduit de son initialiseur. Pour les fonctions, spécifie que le type de retour est un type de retour final ou sera déduit de ses instructions de retour (depuis C ++ 14).

Syntaxe

 auto variable initializer (1) (since C++11) auto function -> return type (2) (since C++11) auto function (3) (since C++14) decltype(auto) variable initializer (4) (since C++14) decltype(auto) function (5) (since C++14) auto :: (6) (concepts TS) cv(optional) auto ref(optional) parameter (7) (since C++14) 

Explication

1) Lors de la déclaration de variables dans la scope du bloc, dans la scope de l’espace de nommage, dans les instructions d’initialisation des boucles for, etc., le mot-clé auto peut être utilisé comme spécificateur de type. Une fois que le type d’initialiseur a été déterminé, le compilateur détermine le type qui remplacera le mot-clé auto en utilisant les règles de déduction d’argument de modèle d’un appel de fonction (voir déduction d’argument de modèle # Autres contextes pour plus de détails). Le mot-clé auto peut être accompagné de modificateurs, tels que const ou &, qui participeront à la déduction de type. Par exemple, avec const auto& i = expr; , le type de i est exactement le type de l’argument u dans un modèle de template void f(const U& u) imaginaire template void f(const U& u) si l’appel de fonction f(expr) été compilé. Par conséquent, auto && peut être déduite soit comme référence lvalue, soit comme référence rvalue en fonction de l’initialiseur, qui est utilisé dans loop pour base. Si auto est utilisé pour déclarer plusieurs variables, les types déduits doivent correspondre. Par exemple, la déclaration auto i = 0, d = 0.0; est mal formé, tandis que la déclaration auto i = 0, *p = &i; est bien formé et l’auto est déduite comme int.

2) Dans une déclaration de fonction qui utilise la syntaxe du type de retour final, le mot-clé auto n’effectue pas la détection de type automatique. Il ne fait que partie de la syntaxe.

3) Dans une déclaration de fonction qui n’utilise pas la syntaxe du type de retour final, le mot-clé auto indique que le type de retour sera déduit de l’opérande de son instruction return en utilisant les règles de déduction des arguments du modèle.

4) Si le type déclaré de la variable est decltype (auto), le mot-clé auto est remplacé par l’expression (ou la liste d’expressions) de son initialiseur, et le type réel est déduit à l’aide des règles de decltype.

5) Si le type de retour de la fonction est déclaré decltype (auto), le mot-clé auto est remplacé par l’opérande de son instruction return et le type de retour réel est déduit en utilisant les règles de decltype.

6) Un spécificateur de nom nested de la forme auto :: est un espace réservé qui est remplacé par un type de classe ou d’énumération suivant les règles de déduction de type fictif de type contraint.

7) Une déclaration de paramètre dans une expression lambda. (depuis C ++ 14) Une déclaration de paramètre de fonction. (concepts TS)

Notes Jusqu’à C ++ 11, auto avait la sémantique d’un spécificateur de durée de stockage. Mélange de variables automatiques et de fonctions dans une déclaration, comme dans auto f() -> int, i = 0; n’est pas autorisé.

Pour plus d’informations: http://fr.cppreference.com/w/cpp/language/auto

Il ne va nulle part … c’est une nouvelle fonctionnalité C ++ standard dans l’implémentation de C ++ 11. Cela étant dit, bien qu’il s’agisse d’un outil formidable pour simplifier les déclarations d’objects et nettoyer la syntaxe de certains paradigmes d’appel (c.-à-d. Des boucles for-based), il ne faut pas trop l’utiliser / abuser 🙂