¿Cuándo se calculan los parámetros, cuando se concatena la llamada: obj.F1 (). F2 (). F3 (sin (x))?

Yo uso los operadores de transmisión (p. Ej.operator<<(const char*)) para iniciar sesión. En mis pruebas unitarias tengo una prueba como la siguiente:

MyLogger oLogger;
oLogger << "charly";
oLogger << "foo" << sleep( 10 ) << "bar";
oLogger << "marcus";

Primero ejecuté un segundo hilo, que debería iniciar sesión al mismo tiempo. Me preguntaba, ¿por qué entre"foo" y"bar" no se generó ninguna otra salida de registro. Entonces imprimí en cada operador la hora actual. Esperaba algo como esto:

50 sec 137051 usec charly 
50 sec 137930 usec foo 
60 sec 138014 usec 0 
60 sec 138047 usec bar 
60 sec 138088 usec marcus 

pero tengo esto:

50 sec 137051 usec charly 
60 sec 137930 usec foo 
60 sec 138014 usec 0 
60 sec 138047 usec bar 
60 sec 138088 usec marcus 

Lo que está mal con la siguiente idea:

[ 0 sec] MyLogger& MyLogger::operator<<( "charly" ) is processed.
[ 0 sec] MyLogger& MyLogger::operator<<( "foo" ) is processed.
         The return value is used for the next function.
[ 0 sec] int sleep( 10 ) is processed - this takes 10 seconds until the return
         value is available
[10 sec] MyLogger& MyLogger::operator<<( 0 ) is processed
         ( "0" is the return value of sleep(10) )
[10 sec] MyLogger& MyLogger::operator<<( "bar" ) is processed

Pero por alguna razón, elMyLogger::operator<<( "foo" ) se procesa despuéssleep(10)?

Respuestas a la pregunta(1)

Su respuesta a la pregunta