gpt4 book ai didi

c++ - 在返回对象的函数调用和对该对象的方法调用之间是否存在序列点?

转载 作者:IT老高 更新时间:2023-10-28 22:28:10 25 4
gpt4 key购买 nike

如果我写 f(x)->g(args, ...) 我可以在评估之前依赖 f(x) 之后的序列点吗参数,...?我可以看到两种方式的论点:

  • §1.9.17 “调用函数时(无论函数是否内联),在所有函数参数(如果有)的评估之后都有一个序列点,该序列点发生在执行任何表达式或语句之前函数体。在复制返回值之后和函数外的任何表达式执行之前还有一个序列点。"
  • 另一方面,对象指针隐含地是一个隐藏参数 this 就好像我写了 g(f(x), args, ...)这表明它就像一个论点,因此未指定。

-> 运算符不是普通的二元运算符,因为显然 g(...) 不能 之前计算f(x) 就像我写 f(x) + g(...) 一样。我很惊讶我找不到关于它的具体说明。

最佳答案

答案取决于您使用的 C++ 标准的版本(或您的编译器正在使用)。

C++ 2003 5.2.2 p8 说:

The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified.

这意味着在计算 f(x)args 之间没有序列点。

在 C++ 2011 中,序列点的整个概念已被替换(参见 N1944),该措辞现在只是一个注释:

[ Note: The evaluations of the postfix expression and of the argument expressions are all unsequenced relative to one another. All side effects of argument expression evaluations are sequenced before the function is entered (see 1.9). — end note ]

和 1.9 p15 说

When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function. [ Note: Value computations and side effects associated with different argument expressions are unsequenced. — end note ]

这表示表达式 f(x) 和表达式 args 排在 g 主体中的所有内容之前,但它们是相对无序,与C++03规则相同,但措辞不同。

C++14 的规则与 C++11 相同,但正如下面评论中所指出的,C++17 中的规则发生了变化。

C++ 2017 8.2.2 [expr.call] p5 说:

The postfix-expression is sequenced before each expression in the expression-list and any default argument. The initialization of a parameter, including every associated value computation and side effect, is indeterminately sequenced with respect to that of any other parameter.

这意味着您的示例将按顺序执行以下步骤:

  • f 被评估。
  • x 被求值,f 的参数被初始化。
  • 对函数调用 f(x) 求值。
  • f(x)->g 被评估。
  • argsg 的其他参数被评估并且 g 的参数被初始化(以未指定的顺序)。
  • 最后,函数调用 f(x)->g(args, ...) 被求值。

关于c++ - 在返回对象的函数调用和对该对象的方法调用之间是否存在序列点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com