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

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

[n3290: 5.18 / 1] : оператор запятой группирует слева направо.

 выражение: 
выражение-присваивания 
выражение, выражение-присваивание 
 

Пара выражений, разделенных запятой, оценивается слева направо ; левое выражение является выражением отброшенного значения (раздел 5). Каждое вычисление значения и побочный эффект, связанный с левым выражением , упорядочивается перед каждым вычислением значения и побочным эффектом, связанным с правым выражением. Тип и значение результата - это тип и значение правого операнда; результат имеет ту же категорию значений , что и его правый операнд, и является битовым полем, если его правый операнд является значением glvalue и битовым полем.

Единственное другое предложение, касающееся оператора, не упоминает порядок оценки. Таким образом, похоже, что это все еще так, когда оператор был перегружен.

Но далее, в общих разговорах о выражениях, конечно, сказано, что правила меняются при перегрузке операторов:

{{1} }

[n3290: 5/2]: [ Примечание: Операторы могут быть перегружены, то есть им присваивается значение при применении к выражениям типа класса ( Пункт 9) или перечислимый тип (7.2). Использование перегруженных операторов преобразуется в вызовы функций, как описано в 13.5. Перегруженные операторы подчиняются правилам синтаксиса, указанным в разделе 5, но требования к типу операнда , категории значения и порядку оценки заменяются правилами для функции вызов. Связи между операторами, например ++ a , означающие a + = 1 , не гарантируются для перегруженных операторов (13.5) и не гарантируются для операндов типа bool . - конец сообщения ]

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

14
задан Community 23 May 2017 в 12:16
поделиться