Ничто здесь не определено, и нет никаких причин для синтаксической ошибки.
Ваш цикл повторяет внешний вектор по значению , затем сортирует локальную копию внутреннего вектора. Это бессмысленно, но не непослушно.
Недавно я узнал, что при изменении данных внутри диапазона, основанного на цикле, результат не определен.
Вы не можете структурно изменить то, что вы повторяете, правда, так как это нарушает итерацию.
Но это не то, что вы сделали. Даже если вы написали auto& v : arr
и таким образом изменили значения внутренних векторов, вы все равно не выполняете никаких операций, которые нарушают итерацию внешнего вектора arr
.
Не пишите arr.clear()
внутри цикла, хотя!
Почему модификация автоматически повторяющихся данных не является синтаксической ошибкой?
Даже если ваша программа имела неопределенное поведение, это никогда не является синтаксической ошибкой, а часто даже ошибкой времени выполнения.
Но если бы было общим правилом, утверждающим, что внутри цикла for, основанного на диапазоне, невозможно выполнить какие-либо операции изменения, будьте уверены, что семантика языка, вероятно, потребует остановки ошибки времени компиляции вам от этого (например, как вы не можете создать программу, которая изменяет const int
напрямую).