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

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

[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, —Конечная записка ]

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам