Я понимаю, что выражение
i = v[i++]
вызывает неопределенное поведение до C ++ 17, так как мы не уверены, какое действие происходит в первую очередь: результат i++
возвращается в i
или значение v[i]
присваивается i
. Но, похоже, все изменилось в C ++ 17.
С N4659 expr.ass
Оператор присваивания (=) и составные операторы присваивания все группы справа налево. Все они требуют изменяемого lvalue в качестве своего левого операнда и возвращают lvalue, ссылаясь на левый операнд. Результатом во всех случаях является битовое поле, если левый операнд является битовым полем. Во всех случаях присваивание выполняется после вычисления значения правого и левого операндов и до вычисления значения выражения присваивания. Правый операнд упорядочен перед левым операндом.
Мне кажется, что в C ++ 17 секвенируется как вычисление значения, так и побочный эффект v [i ++] до операция присваивания (=), которая делает i = v[i++]
законной, с вещами, происходящими в следующем порядке:
- извлекается значение
v[i]
- применяется побочный эффект
i++
, i
увеличивается на 1 - значение
v[i]
, полученное на шаге 1, присваивается i
Я прав?