Cout << порядок вызова функций, которые он печатает?

следующий код:

myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue() << myQueue.dequeue();

выводит "ba" на консоль

а

myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue();
cout << myQueue.dequeue();

печатает "ab", почему это?

Кажется, что cout сначала вызывает самую внешнюю (самую близкую к функции;) функцию и работает, как это ведет себя?

Ответы

Ответ 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 _________|

Ответ 2

Вызов из вашего примера:

cout << myQueue.dequeue() << myQueue.dequeue();

преобразуется в следующее выражение с двумя вызовами функции operator<<:

operator<<( operator<<( cout, myQueue.dequeue() ), myQueue.dequeue() );
-------------------- 1
---------2

Порядок оценки cout, myQueue.dequeue() не указан. Тем не менее, порядок вызовов функций operator<< хорошо указан, как отмечено 1 и 2