Следующее выражение часто используется для демонстрации неуказанного поведения undefined:
f() + g()
Если f()
и g()
имеют побочные эффекты на каком-то общем объекте, тогда поведение undefined не указано, потому что порядок выполнения неизвестен. f()
может быть оценен до g()
или наоборот.
Теперь мне было интересно, что происходит, когда вы цепляете функции-члены за объект. Скажем, у меня есть экземпляр класса, экземпляр с именем obj
и он имеет две функции-члена, foo()
и bar()
, которые оба изменяют объект. Порядок выполнения этих функций не является коммутативным. Эффект вызова одного перед другим - это не тот же эффект, что и вызов другим способом. Оба метода возвращают ссылку на *this
, чтобы они могли быть скованы так:
obj.foo().bar()
Но неужели это неуказанное поведение? Я не могу найти ничего в стандарте (по общему признанию, просто просматривая), который различает это выражение и выражение, которое я дал в верхней части сообщения. Оба вызова функций являются подвыражениями полного выражения, поэтому их порядок выполнения не указан. Но, конечно, foo()
должен оцениваться первым, чтобы bar()
знал, какой объект изменить.
Возможно, мне не хватает чего-то очевидного, но я не вижу, где создается точка последовательности.