Этот код не работает, , так как auto & является константной ссылкой. [выделение мое]
Ваши рассуждения не верны.В цикле for, основанном на диапазоне, то, что вы объявляете (здесь auto& ab
), равно , а не , привязанному к выражению диапазона (здесь {a,b }
).Вместо этого ab
будет инициализироваться из элементов диапазона, а не самого диапазона.
Вместо этого ошибка связана с вызовом std::sort
с параметрами ab.begin()
/ ab.end()
Это легко можно увидеть, комментируя тело цикла.Как указал RMartinho, элементы std::initializer_list<std::vector<double>>
являются неизменяемыми, и вы не можете отсортировать контейнер const
(std::sort
перетасовывает элементы, используя ходы, не может назначаться элементу const
).
Предполагая, что вы хотите (независимо) отсортировать оба вектора, вы можете сделать:
for(auto& ab: { std::ref(a), std::ref(b) })
std::sort(std::begin(ab.get()), std::end(ab.get()));
Обратите внимание, что согласно правилам вывода аргументов шаблона, auto&
здесь хорошо, и auto
будет выведенодо const std::reference_wrapper<std::vector<double>>
, получая std::reference_wrapper<std::vector<double>> const&
как тип ab
.