85 votes

Y a-t-il une raison d'utiliser le mot clé "auto" en C++03 ?

Nota Cette question a été postée à l'origine en 2009, avant que C++11 ne soit ratifié et avant que la signification de l'expression " C++ " ne soit connue. auto le mot-clé a été radicalement modifié. Les réponses fournies concernent sólo à la signification C++03 de auto -- c'est-à-dire une classe de stockage spécifiée -- et non la signification C++11 de auto -- c'est-à-dire une déduction de type automatique. Si vous cherchez des conseils pour savoir quand utiliser la norme C++11 auto cette question n'est pas pertinente pour cette question.

Pendant longtemps, j'ai pensé qu'il n'y avait pas de raison d'utiliser la fonction static en C, car les variables déclarées en dehors de la portée du bloc étaient implicitement globales. Puis j'ai découvert que déclarer une variable comme static dans la portée du bloc lui donnerait une durée permanente, et le déclarer en dehors de la portée du bloc (dans la portée du programme) lui donnerait une portée de fichier (on ne peut y accéder que dans cette unité de compilation).

Il ne me reste donc qu'un seul mot clé que je ne comprends (peut-être) pas encore complètement : Le site auto mot-clé. A-t-il une autre signification que celle de "variable locale" ? Y a-t-il quelque chose qu'il fait qui n'est pas implicitement fait pour vous partout où vous voulez l'utiliser ? Comment un auto se comporte-t-elle dans le cadre du programme ? Qu'en est-il d'une static auto variable dans le champ d'application du fichier ? Ce mot-clé a-t-il un autre but que qui n'existe que par souci d'exhaustivité ?

85voto

std''OrgnlDave Points 2745

En C++11, auto a une nouvelle signification : il permet de déduire automatiquement le type d'une variable.

Pourquoi est-ce utile ? Prenons un exemple de base :

std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
  // Do stuff here
}

El auto il crée un itérateur de type std::list<int>::iterator .

Cela peut rendre certains codes très complexes beaucoup plus faciles à lire.

Un autre exemple :

int x, y;
auto f = [&]{ x += y; };
f();
f();

Là, le auto a déduit le type requis pour stocker une expression lambda dans une variable. Wikipedia a de bons sur le sujet.

4 votes

Je ne suis toujours pas sûr que ce soit une bonne utilisation de l'auto. Le code doit être facile à lire, pas facile à écrire !

38 votes

Je ne sais pas pour vous, mais je trouve cela beaucoup plus facile à lire que le spam de type itérateur.

17 votes

Et si, pour une raison quelconque, vous décidez de changer la classe de list<int> pour une autre classe, vous n'avez pas besoin de rechercher chaque déclaration d'itérateur et de la modifier.

75voto

Johannes Schaub - litb Points 256113

auto est un spécificateur de classe de stockage, static , register y extern aussi. Vous ne pouvez utiliser qu'un seul de ces quatre éléments dans une déclaration.

Variables locales (sans static ) ont une durée de stockage automatique, ce qui signifie qu'ils vivent du début de leur définition jusqu'à la fin de leur bloc. Mettre auto devant eux est redondant puisque c'est la valeur par défaut de toute façon.

Je ne connais pas de raison de l'utiliser en C++. Dans les anciennes versions du C qui ont la règle de l'int implicite, vous pouviez l'utiliser pour déclarer une variable, comme dans :

int main(void) { auto i = 1; }

Pour en faire une syntaxe valide ou la désambiguïser d'une expression d'affectation en cas i est dans le champ d'application. Mais cela ne fonctionne pas en C++ de toute façon (vous devez spécifier un type). C'est assez drôle, la norme C++ écrit :

Un objet déclaré sans spécification de classe de stockage à l'échelle du bloc ou déclaré comme paramètre de fonction a une durée de stockage automatique par défaut. [Note : par conséquent, le spécificateur auto est presque toujours redondant et n'est pas souvent utilisé ; une utilisation de auto est de distinguer explicitement une déclaration d'une expression (6.8). - note de fin]

qui fait référence au scénario suivant, qui pourrait être soit un casting de a a int ou la déclaration d'une variable a de tipo int avoir des parenthèses redondantes autour a . Il est toujours considéré comme une déclaration, donc auto n'ajouterait rien d'utile ici, mais le ferait pour l'humain, à la place. Mais encore une fois, l'humain ferait mieux de supprimer les parenthèses redondantes autour de a je dirais :

int(a);

Avec la nouvelle signification de auto arrivant avec C++0x, je déconseillerais de l'utiliser avec la signification de C++03 dans le code.

0 votes

Je ne savais pas qu'on pouvait faire ça C'est quel C ? Pré-ANSI ?

0 votes

Il fonctionnera dans la prochaine version standard de C++. Je n'ai jamais pensé à auto i = 1. La plupart des exemples de la nouvelle utilisation utilisent auto i = container.begin()

4 votes

Les compilateurs C++ avaient souvent l'habitude d'avoir des int implicites pour les valeurs de retour des fonctions, à l'époque de l'ARM, avant la norme... Avant l'EMPIRE...

35voto

Daniel Earwicker Points 63298

Le mot-clé "auto" n'a aucune utilité pour le moment. Vous avez tout à fait raison, il ne fait que réaffirmer la classe de stockage par défaut d'une variable locale, l'alternative vraiment utile étant static .

Il dispose d'un toute nouvelle signification en C++0x. Cela vous donne une idée de son inutilité !

1 votes

Oh mec, c'est toujours inutile. J'aime bien la nouvelle signification cependant. Cela rend certains codes beaucoup moins verbeux et redondants.

0 votes

Oui, ayant utilisé l'équivalent en C#, cela fera probablement une énorme différence. C'est encore plus vrai en C++ si vous utilisez des modèles d'expression où les types sont si complexes qu'ils n'ont jamais été conçus pour être écrits à la main.

7voto

qrdl Points 17813

Le GCC a une utilisation particulière de auto pour les fonctions imbriquées - voir aquí .

Si vous avez une fonction imbriquée que vous voulez appeler avant sa définition, vous devez la déclarer avec auto .

0 votes

Il s'agit d'une excellente implémentation de auto, bien que dépendante du compilateur. Merci pour la recherche :)

3voto

T.E.D. Points 26829

"auto" est censé dire au compilateur de décider lui-même où placer la variable (mémoire ou registre). Son analogue est "register", qui est censé dire au compilateur d'essayer de la garder dans un registre. Les compilateurs modernes ignorent les deux, vous devriez donc en faire autant.

1 votes

Pas exactement - si vous la déclarez avec "register", les compilateurs ne vous laissent pas utiliser l'opérateur d'adresse (&foo) sur la variable parce que, eh bien, elle n'existe nulle part en mémoire (et n'a donc pas d'adresse).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X