Действительно ли перегрузка оператора запятой * действительно * влияет на порядок вычисления его операндов? - PullRequest
14 голосов
/ 19 октября 2011

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

[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 Ответ

10 голосов
/ 19 октября 2011

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

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

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

...