En lisant quelques exemples de boucles basées sur une plage, ils suggèrent deux façons principales 1 , 2 , 3 , 4
std::vector<MyClass> vec;
for (auto &x : vec)
{
// x is a reference to an item of vec
// We can change vec's items by changing x
}
ou
for (auto x : vec)
{
// Value of x is copied from an item of vec
// We can not change vec's items by changing x
}
Bien.
Lorsque nous n'avons pas besoin de changer les vec
éléments, l'OMI, les exemples suggèrent d'utiliser la deuxième version (par valeur). Pourquoi ils ne suggèrent pas quelque chose qui fait const
référence (au moins, je n'ai trouvé aucune suggestion directe):
for (auto const &x : vec) // <-- see const keyword
{
// x is a reference to an const item of vec
// We can not change vec's items by changing x
}
N'est-ce pas mieux? N'évite-t-il pas une copie redondante à chaque itération alors que c'est un const
?
const auto &x
équivaut à votre troisième choix.