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