следующий код:
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", почему это?
Кажется, как будто суд называет наиболее удаленное (самый близкий к;) функционируют сначала и прокладывающий себе путь в, который является способом, которым это ведет себя?
С оператором <<
нет точки следования, поэтому компилятор может сначала оценить любую из функций dequeue
. Гарантируется, что результат второго вызова dequeue
(в порядке, в котором он появляется в выражении, а не обязательно в порядке, в котором он вычисляется) будет <<
'ed к результату <<
первого (если вы поняли, о чём я говорю).
Таким образом, компилятор вольен транслировать ваш код в какую-нибудь вещь вроде этой (псевдо-посредник c++). Это не претендует на то, чтобы быть исчерпывающим списком.
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 _________|
Вызов из Вашего примера:
cout << myQueue.dequeue() << myQueue.dequeue();
переводится в следующее выражение с двумя вызовами оператора оператора<<
:
operator<<( operator<<( cout, myQueue.dequeue() ), myQueue.dequeue() );
-------------------- 1
---------2
Порядок оценки cout
, myQueue.dequeue()
не указан. Однако порядок вызова функции оператора<<
хорошо указан, что обозначено с помощью 1
и 2