Ответ 1
Нет точки последовательности с оператором <<
, поэтому компилятор может сначала оценить функцию dequeue
. Гарантируется, что результат второго вызова dequeue
(в том порядке, в котором он появляется в выражении и не обязательно в порядке, в котором он оценивается) равен <<
'ed для результата <<
' (если вы получите то, что я говорю).
Таким образом, компилятор может свободно переводить ваш код в нечто вроде любого из них (псевдо-промежуточное С++). Это не должно быть исчерпывающим списком.
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 _________|