Позвольте мне попробовать интерпретировать стандарт C ++ 11 по этому поводу. В §1.9 / 15 говорится:
Если не указано иное, вычисления операндов отдельных операторов и подвыражений отдельных выражений неупорядочены. [...] Если побочный эффект для скалярного объекта не упорядочен относительно другого побочного эффекта для того же скалярного объекта или вычисления значения с использованием значения того же скалярного объекта, поведение не определено.
Конечно, int
является скалярным типом, а t.set(i).print(i + 5);
содержит побочный эффект на i
в set()
и вычислении значения i + 5
, поэтому, если не указано иное, поведение действительно не определено. Читая §5.2.5 («Доступ к членам класса»), я не смог найти никаких примечаний о последовательностях, касающихся оператора .
. [Но см. Правку ниже!]
Обратите внимание, однако, что, конечно, гарантируется, что set()
выполняется до print()
, потому что последний получает возвращаемое значение первого в качестве (неявного this
) аргумента. Причина здесь в том, что вычисление значений для аргументов print
выполняется без последовательности с неопределенной последовательностью относительно вызова set
.
РЕДАКТИРОВАТЬ: Прочитав ответ в вашем комментарии (@ Xeno), я перечитал абзац в стандарте, и на самом деле позже он говорит:
Каждая оценка в вызывающей функции (включая вызовы других функций), которая иначе не упорядочена до или после выполнения тела вызываемой функции, имеет неопределенную последовательность относительно выполнения вызываемой функции.
Поскольку неопределенно упорядоченный не неупорядоченный («выполнение неупорядоченных оценок может перекрываться», §1.9 / 13), это действительно не неопределенное поведение, а «просто» неопределенное поведение, Это означает, что и 15, и 5 являются правильными выходами.
Таким образом, когда <
означает «упорядоченный до», а ~
означает «неопределенно упорядоченный», мы имеем:
(value computations for print()'s arguments ~ execution of set()) < execution of print()
person
Oberon
schedule
16.02.2014
0 + 5
вprint()
, а затем распечатываете его напрямую. В следующий раз отладьте свой код. - person StoryTeller - Unslander Monica   schedule 16.02.2014i + 5
!? - person StoryTeller - Unslander Monica   schedule 16.02.2014