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