Lendo alguns exemplos de loops baseados em intervalo, eles sugerem duas maneiras principais 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
}
Bem.
Quando não precisamos alterar vec
itens, os Exemplos da IMO sugerem o uso da segunda versão (por valor). Por que eles não sugerem algo que const
faça referência (pelo menos eu não encontrei nenhuma sugestão direta):
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ão é melhor? Não evita uma cópia redundante em cada iteração enquanto é const
?
const auto &x
é equivalente à sua terceira escolha.