Порядок оценки не указан. Соответствующий раздел проекта C ++ 0x spec составляет 1,9, пункты 14 и 15:
14 Каждое вычисление значения и побочный эффект, связанный с полным выражением , упорядочивается перед каждым вычислением значения и побочным эффектом, связанным со следующим полным выражением , которое будет оценено.
15 Если не указано иное, вычисления операндов отдельных операторов и подвыражений отдельных выражений не являются последовательными.
Здесь соответствующее полное выражение :
TFoo(TFoo::bar1()).foobar1(TFoo::bar2()).foobar2(TFoo::bar3());
И поэтому оценка его подвыражений не является последовательной (если только где-то не было отмечено исключение, которое я пропустил).
Я почти уверен, что более ранние стандарты включают в себя язык, имеющий тот же эффект, но в терминах "точек последовательности".
[править]
В пункте 15 также говорится:
При вызове функции (независимо от того, является ли функция встроенной), каждое вычисление значения и побочный эффект, связанные с любым выражением аргумента или с выражением постфикса, обозначающим вызываемую функцию, упорядочиваются перед выполнением каждого выражения или оператора в тело вызываемой функции. [Примечание: вычисления значений и побочные эффекты, связанные с различными выражениями аргументов, не являются последовательными. - примечание к концу]
«Постфиксное выражение, обозначающее вызываемую функцию» - это что-то вроде foo().bar
в foo().bar()
.
«Примечание» здесь просто поясняет, что порядок оценки аргумента не является исключением по умолчанию для «неопределенного порядка». Выводом также не является порядок оценки, связанный с «постфиксным выражением, обозначающим вызываемую функцию»; или, если хотите, порядок вычисления выражения для аргумента this
. (Если бы было исключение, это было бы естественным местом для его указания. Или, возможно, в разделе 5.2.2, где говорится о вызовах функций. Ни в одном из разделов ничего не говорится о порядке оценки для этого примера, поэтому он не указан.)