Читая некоторые примеры циклов на основе диапазона, они предлагают два основных способа 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
}
или
for (auto x : vec)
{
// Value of x is copied from an item of vec
// We can not change vec's items by changing x
}
Хорошо.
Когда нам не нужно менять vec
предметы, IMO, Примеры предлагают использовать вторую версию (по значению). Почему они не предлагают что-то, что const
ссылки (по крайней мере, я не нашел прямого предложения):
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
}
Разве это не лучше? Разве это не позволяет избежать избыточной копии в каждой итерации, пока она const
?
const auto &x
эквивалентно вашему третьему выбору.