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

StackOverflow https://stackoverflow.com/questions/7820618

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top