cout << ordem de chamada para funções que imprime?

o seguinte código:

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

imprime “ba” no console

enquanto:

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

imprime “ab” porque é isso?

Parece que cout está chamando a function mais externa (mais próxima da) primeiro e trabalhando, é como ela se comporta?

Não há ponto de seqüência com o operador << , portanto, o compilador está livre para avaliar a function de dequeue primeiro. O que é garantido é que o resultado da segunda chamada de dequeue (na ordem em que aparece na expressão e não necessariamente a ordem em que é avaliada) é << ed para o resultado de << 'ing o primeiro ( se você entender o que estou dizendo).

Portanto, o compilador está livre para traduzir seu código em algo como qualquer um desses (pseudo-intermediário c ++). Isso não pretende ser uma lista exaustiva.

 auto tmp2 = myQueue.dequeue(); auto tmp1 = myQueue.dequeue(); std::ostream& tmp3 = cout << tmp1; tmp3 << tmp2; 

ou

 auto tmp1 = myQueue.dequeue(); auto tmp2 = myQueue.dequeue(); std::ostream& tmp3 = cout << tmp1; tmp3 << tmp2; 

ou

 auto tmp1 = myQueue.dequeue(); std::ostream& tmp3 = cout << tmp1; auto tmp2 = myQueue.dequeue(); tmp3 << tmp2; 

Aqui está o que os temporários correspondem na expressão original.

 cout << myQueue.dequeue() << myQueue.dequeue(); | | | | | | |____ tmp1 _____| |_____ tmp2 ____| | | |________ tmp3 _________| 

A chamada do seu exemplo:

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

traduz a seguinte expressão com duas chamadas da function operator<< :

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

A ordem de avaliação de cout , myQueue.dequeue() não é especificada. No entanto, a ordem das chamadas de function do operator<< é bem especificada, conforme marcado com 1 e 2

Desde C ++ 17, o comportamento deste código mudou; o operando esquerdo de << é sequenciado antes do operando direito de << , mesmo quando é um operador sobrecarregado. A saída deve agora ser ab .

Para mais informações, consulte: Quais são as garantias de ordem de avaliação introduzidas pelo C ++ 17? .