Ответ на этот вопрос изменился в 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.