Действительно ли перегрузка оператора запятой * действительно влияет на порядок оценки его операндов?

Оператор запятой гарантирует порядок оценки слева направо.

[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]

Однако это ненормативный текст. Есть ли какой-либо нормативный текст, определяющий это правило, или может ли его совместимый компилятор игнорировать?

Ответы

Ответ 1

У меня есть только стандарт 03, но в нем 5/3 говорится: "Раздел 5 определяет эффекты операторов при применении к типам, для которых они не были перегружены".

Таким образом, все пункты 5, включая 5.18/1, применяются только к встроенным операторам, а не к любой перегруженной функции.

(Соответствующий компилятор всегда может оценивать операнды до перегруженного operator ,() слева направо, хотя.)