запись с помощью сокращенного цикла итератора

Я заметил, что использование сокращения for (auto i : <iterable>) даст вам i, который:

а) на самом деле не является итератором.. или, по крайней мере, уже разыменован б) не позволит вам изменить итерируемый объект.

Поэтому этот код

std::vector<std::vector<int>> int_matrix(10);

for (auto line : int_matrix)
{
    line.resize(10);    
}

Не изменит размер векторов внутри матрицы, в отличие от этого кода:

for (auto line =  int_matrix.begin(); line != int_matrix.end(); ++line)
{
    line->resize(10);
}

Почему это так и как вы можете заставить итераторы из сокращения фактически изменять итерируемый объект?


person lo tolmencre    schedule 03.05.2016    source источник
comment
хорошо, немного предыстории или хотя бы поисковый запрос для получения дополнительной информации?   -  person lo tolmencre    schedule 04.05.2016
comment
en.cppreference.com/w/cpp/language/auto   -  person LogicStuff    schedule 04.05.2016
comment
Дубликат сообщает вам, как вы можете изменить содержимое итерируемого объекта, используя диапазон для цикла. Однако вы не можете изменить сам повторяемый объект. Вы не можете добавлять элементы в std::vector, используя цикл for диапазона, и ожидать, что он будет работать как обычный цикл for.   -  person R Sahu    schedule 04.05.2016