Точка последовательности с оператором <<
отсутствует, поэтому компилятор может сначала оценить любую функцию dequeue
. Что гарантировано, так это то, что результат второго dequeue
вызова (в порядке, в котором он появляется в выражении, а не обязательно в порядке, в котором он оценивается) <<
'преобразуется в результат <<
' сначала (если вы понимаете, о чем я говорю).
Таким образом, компилятор может свободно переводить ваш код в нечто подобное (псевдо-промежуточный с ++). Этот список не является исчерпывающим.
auto tmp2 = myQueue.dequeue();
auto tmp1 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
tmp3 << tmp2;
или
auto tmp1 = myQueue.dequeue();
auto tmp2 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
tmp3 << tmp2;
или
auto tmp1 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
auto tmp2 = myQueue.dequeue();
tmp3 << tmp2;
Вот что соответствует временным выражениям в исходном выражении.
cout << myQueue.dequeue() << myQueue.dequeue();
| | | | |
| |____ tmp1 _____| |_____ tmp2 ____|
| |
|________ tmp3 _________|