Czytając niektóre przykłady pętli opartych na zakresie, sugerują dwa główne sposoby 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
}
lub
for (auto x : vec)
{
// Value of x is copied from an item of vec
// We can not change vec's items by changing x
}
Dobrze.
Kiedy nie potrzebujemy zmieniać vec
elementów, IMO, Przykłady sugerują użycie drugiej wersji (według wartości). Dlaczego nie sugerują czegoś, do czego się const
odwołują (Przynajmniej nie znalazłem żadnej bezpośredniej sugestii):
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
}
Czy to nie jest lepsze? Czy nie unika się zbędnej kopii w każdej iteracji, gdy jest to const
?
const auto &x
jest to odpowiednik twojego trzeciego wyboru.