Действительно ли перегрузка оператора запятой * действительно влияет на порядок оценки его операндов?
Оператор запятой гарантирует порядок оценки слева направо.
[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 ,()
слева направо, хотя.)