Оператор запятой гарантирует порядок оценки слева направо.
[n3290: 5.18/1]
: оператор запятой группирует слева направо.expression: assignment-expression expression , assignment-expression
Пара выражений, разделенных запятой, оценивается слева направо; левое выражение - это выражение с отброшенным значением (раздел 5). Каждый вычисление значения и побочный эффект, связанный с левым выражением секвенируется перед вычислением каждого значения и связанного с ним побочного эффекта с правильным выражением. Тип и значение результата: тип и значение правильного операнда; результат имеет одинаковую ценность как его правый операнд и является битовым полем, если его правый операнд это glvalue и бит-поле.
Единственное другое положение, касающееся оператора, не упоминает порядок оценки. Таким образом, казалось бы, это все равно, когда оператор был перегружен.
Но затем, в общем случае, в общем выражении относительно выражений, конечно, указывается, что правила меняются при перегрузке операторов:
[n3290: 5/2]:
[Примечание. Операторы могут быть перегружены, то есть заданы значение применительно к выражениям типа класса (раздел 9) или тип перечисления (7.2). Использование перегруженных операторов преобразуется в вызовы функций, как описано в 13.5. Перегруженные операторы подчиняются правила для синтаксиса, указанные в пункте 5, но требования тип операнда, категория значений и порядок оценки заменяются правила для вызова функции. Отношения между операторами, такими как++a
значениеa+=1
, не гарантируются для перегруженных операторов (13.5) и не гарантируются для операндов типаbool
. -end note]
Однако это ненормативный текст. Есть ли какой-либо нормативный текст, определяющий это правило, или может ли его совместимый компилятор игнорировать?