Если я напишу f(x)->g(args, ...)
могу ли я положиться на точку последовательности после f(x)
до оценки args, ...
? Я могу видеть аргументы в обоих направлениях:
this
как будто я написал g(f(x), args, ...)
что говорит о том, что это как аргумент, и, следовательно, не указано. ->
оператор не является нормальным бинарным оператором, так как ясно g(...)
не могу оцениваться раньше f(x)
как мог бы, если бы я написал f(x) + g(...)
, Я удивлен, что не могу найти какое-то конкретное заявление по этому поводу.
C ++ 2003 5.2.2 p8
Порядок оценки аргументов не уточняется. Все побочные эффекты при оценке выражений аргументов вступают в силу до ввода функции. Порядок вычисления выражения postfix и списка выражений аргументов не определен.
Это означает, что есть не последовательность между оценкой f(x)
а также args
,
В C ++ 2011 вся концепция точек последовательности была заменена (см. N1944), и эта формулировка теперь просто примечание:
[ Замечания: Оценки выражения postfix и выражений аргумента не являются последовательными по отношению друг к другу. Все побочные эффекты при оценке выражений аргументов секвенируются до входа в функцию (см. 1.9). — конечная нота ]
и 1,9 р15 говорит
При вызове функции (независимо от того, является ли функция встроенной), каждое вычисление значения и побочный эффект, связанный с любым выражением аргумента или с выражением постфикса, обозначающим вызываемую функцию, упорядочивается перед выполнением каждого выражения или оператора в теле вызываемая функция. [ Замечания: Вычисления значений и побочные эффекты, связанные с различными выражениями аргументов, не являются последовательными. — конечная нота ]
Это говорит выражение f(x)
и выражение args
последовательность перед всем в теле g
, но они не упорядочены по отношению друг к другу, что соответствует правилам C ++ 03, но сформулировано по-другому.
Заметьте, я думаю, что вы задаете один вопрос в заголовке, а другой — в теле вашего вопроса.
Ну, это не совсем противоречиво. Чтобы оценить вашу функцию, должны произойти следующие вещи (не обязательно в этом порядке).
Теперь приведенные вами правила показывают, что
Однако то, что не упорядочено, это связь между (A), (B) и (C), или в вашем вопросе между (B) и (C) и (D), так как они не являются аргументами для (F), они могут быть оценены впоследствии. ИЛИ, они могут быть оценены ранее.
* Интересный вопрос. Что происходит, если g (args, …) является статической функцией-членом. В этом случае, поскольку возвращенный указатель из f (x) фактически не передается, можно ли упорядочить его раньше? Но это отдельный вопрос.