The evaluation procedure is not specified. The corresponding section of the C ++ 0x spec project is 1.9, paragraphs 14 and 15:
14 Each calculation of a value and the side effect associated with the full expression are sequenced before each value is calculated and the side effect associated with the next full expression to be evaluated.
15 Except where noted, evaluations of the operands of individual operators and subexpressions of individual expressions are not affected.
Here's the corresponding full expression:
TFoo(TFoo::bar1()).foobar1(TFoo::bar2()).foobar2(TFoo::bar3());
Thus, evaluating his subexpressions does not matter (unless an exception that I missed is indicated).
I am sure that earlier standards include a language that has the same effect, but in terms of "sequence points."
[edit]
Paragraph 15 also states:
When a function is called (regardless of whether the function is built-in), each value calculation and side effect associated with any argument expression, or with the postfix expression indicating the function to be called, are sequenced before each expression or statement is executed in the body of the function being called. [Note: value calculations and side effects associated with different expressions of the argument have no consequences. - end note]
A "postfix expression indicating the function to be called" is similar to foo().bar in foo().bar() .
The “note” here simply states that the order in which the argument is evaluated is not an exception to the default “unspecified order”. In conclusion, not a single evaluation order associated with the "postfix expression denoting the called function"; or, if you want, the order in which the expression evaluates to the this argument. (If there were an exception, this would be a natural place to point it out. Or, perhaps, section 5.2.2, which talks about function calls. None of the sections says anything about the evaluation order for this example, so it is not listed. )