С++ 17 порядок оценки с функциями перегрузки оператора

Относительно этого вопроса

Каковы гарантии порядка оценки, введенные С++ 17?

С этой спецификацией

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf

И этот текст из спецификации

Кроме того, мы предлагаем следующее дополнительное правило: порядок оценка выражения с использованием перегруженного оператора определяемый порядком, связанным с соответствующим встроенным оператора, а не правила для вызовов функций.

Означает ли это, что эти два выражения больше не эквивалентны?

a << b;
operator<<(a, b);

Как второй выглядит как вызов функции, следовательно, в параметрах нет гарантированного порядка оценки?

Ответ 1

"Поскольку второй выглядит как вызов функции, следовательно, в параметрах нет гарантированного порядка оценки?"

Действительно. [expr.call]/5 содержит пример, конкретно охватывающий разницу между двумя рассмотренными в вашем случае случаями [ emphasis mine]:

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

...

Примечание. Если оператор-оператор вызывается с использованием обозначения оператора, оценка аргумента секвенирована, как указано для встроенного Оператор; видеть [over.match.oper]. [Пример:

struct S {
  S(int);
};
int operator<<(S, int);
int i, j;
int x = S(i=1) << (i=2);
int y = operator<<(S(j=1), j=2);

После выполнения инициализации значение i равно 2 (см. [expr.shift]), но он не указан, является ли значение j 1 или 2.

- конец примера]