No you cannot rely on this behaviour. Modifying the vector inside the loop results in undefined behaviour because the iterators used by the loop are invalidated when the vector is modified.
The range based for loop
for ( range_declaration : range_expression) loop_statement
is essentially equivalent to
{
auto && __range = range_expression ;
for (auto __begin = std::begin(__range),
__end = std::end(__range);
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
When you modify the vector, the iterators __begin
and __end
are no longer valid and the dereferencing __begin
results in undefined behaviour.