Quando os parâmetros são calculados ao concatenar a chamada: obj.F1 (). F2 (). F3 (sin (x))?

Eu uso os operadores de streaming (por exemplo,operator<<(const char*)) para o log. Nos meus testes de unidade, tenho um teste como o seguinte:

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

Primeiro, executei um segundo thread, que deve registrar ao mesmo tempo. Fiquei me perguntando, por que entre"foo" e"bar" nenhum outro log-output foi gerado. Então imprimi em cada operador a hora atual. Eu esperava algo assim:

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 

mas entendi:

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 

O que há de errado com a seguinte ideia:

[ 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

Mas, por que motivo, oMyLogger::operator<<( "foo" ) é processado depoissleep(10)?

questionAnswers(1)

yourAnswerToTheQuestion