Является ли i = v [i ++] законным в C ++ 17? - PullRequest
1 голос
/ 16 апреля 2020

Я понимаю, что выражение

i = v[i++] 

вызывает неопределенное поведение до C ++ 17, так как мы не уверены, какое действие происходит в первую очередь: результат i++ возвращается в i или значение v[i] присваивается i. Но, похоже, все изменилось в C ++ 17.

С N4659 expr.ass

Оператор присваивания (=) и составные операторы присваивания все группы справа налево. Все они требуют изменяемого lvalue в качестве своего левого операнда и возвращают lvalue, ссылаясь на левый операнд. Результатом во всех случаях является битовое поле, если левый операнд является битовым полем. Во всех случаях присваивание выполняется после вычисления значения правого и левого операндов и до вычисления значения выражения присваивания. Правый операнд упорядочен перед левым операндом.

Мне кажется, что в C ++ 17 секвенируется как вычисление значения, так и побочный эффект v [i ++] до операция присваивания (=), которая делает i = v[i++] законной, с вещами, происходящими в следующем порядке:

  1. извлекается значение v[i]
  2. применяется побочный эффект i++, i увеличивается на 1
  3. значение v[i], полученное на шаге 1, присваивается i

Я прав?

...