cout << порядок вызова функций, которые он печатает? - PullRequest
26 голосов
/ 25 января 2010

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

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 сначала вызывает самую внешнюю (ближайшую к;) функцию и работает в ней, это то, как она себя ведет?

Ответы [ 3 ]

29 голосов
/ 25 января 2010

Точка последовательности с оператором << отсутствует, поэтому компилятор может сначала оценить любую функцию 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 _________|
8 голосов
/ 25 января 2010

Звонок из вашего примера:

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

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

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

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

2 голосов
/ 27 июня 2018

Начиная с C ++ 17 поведение этого кода изменилось; левый операнд << упорядочен перед правым операндом <<, даже если он перегружен. Теперь вывод должен быть ab.

Подробнее см .: Какие гарантии порядка оценки введены в C ++ 17? .

...