Я изучаю C++ и пытаюсь понять циклы for на основе диапазона. Рассмотрим следующий код
std::array<int,5> items{1,2,3,4,5};
for(int item: items){
std::cout << std::setw(10) << item;
}
std::cout << std::endl;
for(int item: items){
item++;
std::cout << std::setw(10) << item;
}
std::cout << std::endl;
for(int item: items){
std::cout << std::setw(10) << item;
}
std::cout << std::endl;
Он печатает
1 2 3 4 5
2 3 4 5 6
1 2 3 4 5
Таким образом, я понимаю, что item принимает значение соответствующего элемента. Это заставляет меня задуматься, что происходит с более сложными типами. Я предполагаю, что item — это локальная переменная, которая принимает копию соответствующего элемента в items. Означает ли это, что если items представляет собой массив более крупных объектов, скажем
std::array<MyObject,5> items
цикл for принимает копию каждого элемента?
(p.s. я знаю, что могу изменить значение исходного элемента, используя int& item: items).
См. этот ответ в дубле: Цикл на основе диапазона: получить элемент по значению
А еще Почему цикл for на основе диапазона не изменяет элементы контейнера?
Примечание: ничто в этом коде не требует дополнительных вещей, которые делает std::endl. Используйте '\n', чтобы завершить строку, если нет веской причины не делать этого.
Копию создает не цикл for; это int item.





По умолчанию он копирует элементы. Но при взятии ссылки на элементы вы получаете ссылку и значения будут изменены.
for(int &item: items){
item++;
}
При использовании объектов избегайте вызова конструктора копирования таким образом.
Вызывается конструктор копирования.
for (Object item: items) { }
Конструктор копирования не вызывается
for (Object &item: items) { }
Если вам нужна производительность без вызова конструктора копирования, но вы не хотите изменять объекты, сделайте их константными.
for (const Object &item: items) { }
Да,
int item : ...делает копию каждого элемента. Да, для более сложных типов это может быть дорого, поэтому вы часто видитеconst MyType &item : ...илиconst auto &item : ....