Это проблема порядка выполнения, и она не определена из-за С++ 11:
5.17 Операторы присваивания и составные операторы присваивания
Оператор присваивания (=) и составные операторы присваивания группируются справа налево. Все они требуют модифицируемого lvalue в качестве левого операнда и возвращают lvalue, ссылающееся на левый операнд. Результатом во всех случаях является битовое поле, если левый операнд является битовым полем. Во всех случаях присваивание выполняется после вычисления значения правого и левого операндов и до вычисления значения выражения присваивания.
Проще говоря, модификация левого аргумента выполняется после вычисления значения, но не побочных эффектов вычисления с обеих сторон и до возврата ссылки на объект.
Итак, действия, которые необходимо предпринять,
A. оценить левую часть (возвращаемое значение выражения i++ = 0)
B. вернуть ссылку на объект (вернуть ссылку на объект выражения v[i++])
C. вычислить побочные эффекты для левой стороны, т.е. i-> 1
D. вычислить побочные эффекты для правой стороны, т.е. i-> 2
Как вы можете видеть из приведенного выше правила, неясно, является ли порядок ABCD или должен быть ACBD , поскольку порядок вычисления побочных эффектов не определен, должно ли это произойти сначала для левой стороны или сначала для правая сторона.
person
g24l
schedule
07.12.2015