Ответ на этот вопрос изменился в C ++ 17.
Оценка перегруженных операторов теперь упорядочена так же, как и для встроенных операторов (C ++ 17 [over.match.oper ] / 2).
Кроме того, теперь <<
, >>
и операторы подписи теперь имеют левый операнд , упорядоченный до справа, а постфиксное выражение вызова функции - упорядочивается до оценки аргументов.
(Другие бинарные операторы сохраняют свое предыдущее упорядочение, например +
по-прежнему не подвержены последовательности).
Итак, код в вопросе должен теперь выводить Value of test is : 0 Return value of function is : 1 Value of test : 1
. Но совет «Не делай этого» по-прежнему разумен, учитывая, что для обновления до C ++ 17 потребуется некоторое время.