Salut,
Envoyé par
jblecanard
Tu peux développer ? Y a-t-il des pièges à éviter autres que les conversions de types automatiques hasardeuses avec auto ?
En C++03, le mot clé auto était un "storage classe specifier", c'est à dire un mot clé qui permettait d'indiquer explicitement qu'une variable avait une durée de vie automatique (s'étendant de sa déclaration à l'accolade fermante qui la contenait).
C'est, en fait, le comportement par défaut de toute variable
Comme on s'est rendu compte à l'usage que ce mot clé n'était pour ainsi dire jamais utilisé, on a décidé (comprends: les membres du comité de normalisation on décidé, car je n'ai rien à voir là dedans ) de supprimer cet usage et de le remplacer par quelque chose de plus intéressant et sans doute de beaucoup plus utile: le fait d'indiquer au compilateur qu'il doit essayer de déterminer de lui-même le type de la variable en fonction du contexte.
L'énorme avantage est qu'il n'est plus forcément utile d'écrire un code proche de
1 2
|
std::map<std::complex<double>, std::string>::const_iterator it = lamap.find(/*...*/ ); |
car on peut se contenter d'un
auto it = lamap.find(/*...*/);
qui fera en sorte que le type de it sera automatiquement déduit du type de retour de find (un const_iterator ou un iterator, en fonction du contexte, en l'occurrence)
Note cependant que l'on peut parfois être surpris du type déduit, avec un code proche de
1 2 3 4 5 6 7 8 9 10
| std::map<Cle, Valeur> lamap;
/* le remplicage que je passe */
for(auto it : lamap) //"range based loop" qui parcourt l'ensemble des éléments
{
// it n'est pas un std::map<Cle, Valeur>::const_iteator,
// ni même un std::map<Cle, Valeur>::iterator
// mais sans doute un std::pair<Cle, Valeur>
// (voir une référence (éventuellement constante) sur une std::pair<Clé, Valeur>
// si on a écrit for(auto /* const &*/ it : lamap) ;) )
} |
Partager