(a=1)=2
не был определен до C ++ 11, так как оператор =
не вводил точку последовательности и, следовательно, a
изменяется дважды без промежуточной точки последовательности. То же самое относится к (a+=1)%=7
Текст был:
Между предыдущей и следующей точкой последовательности скалярному объекту должно быть сохранено его значение, измененное не более одного раза путем оценки выражение.
Стоит отметить, что описание оператора присваивания является дефектным:
Результатом операции присваивания является значение, сохраненное в левом операнде после присваивания произошло; результатом является lvalue.
Если результатом является lvalue, то результатом не может быть сохраненное значение (это будет r-значением). L-значения обозначают ячейки памяти. Это предложение, кажется, подразумевает отношение порядка, но независимо от того, как мы хотим его интерпретировать, оно не использует термин «точка последовательности», и поэтому применяется более ранний текст о точках последовательности.
Во всяком случае, эта формулировка вызывает сомнения в выражениях типа (a=1) + 2
. Пересмотр секвенирования в C ++ 11 исправил все эти двусмысленности.