Это проблема порядка исполнения, и это не определено в связи с C++ 11:
5.17 Назначение и составные операторы присваивания
Оператор присваивания (=) и сложные операторы присваивания все группы справа налево. Все они требуют модифицируемого lvalue как их левого операнда и возвращают значение lvalue, относящееся к левому операнду. Результат во всех случаях является битовым полем, если левый операнд является битовым полем. В всех случаях назначение секвенировало после значения вычислению правых и левые операндов, и перед тем вычисления значения выражения в назначении.
Проще говоря, модификация левого аргумента упорядочивается после вычисления значения, но не побочных эффектов вычисления, с обеих сторон и перед возвратом ссылки на объект.
поэтому действия, которые будут приняты, будут
А. оценить левую сторону (возвращаемое значение выражения я ++ = 0)
Б. возвращают ссылку на объект (возвращение ссылки на объект выражения V [я ++])
C. Compute побочные эффекты для левой стороны т.е. i-> 1
Д. вычислить побочные эффекты для правой стороны т.е. i-> 2
Как видно из приведенного выше правила, неясно, является ли порядок ABCD , или если он должен быть ACBD, так как порядок вычисления побочных эффектов не определен, если это должно произойти сначала для левой или первой для правой стороны.
Просто dv, но нет причин ... Может быть стратегия ?! – g24l