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

Ben*_*son 15 c++ sequence-points unspecified-behavior

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

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

->操作是不正常的二元运算符,因为显然g(...) 不能被评估之前f(x),如果我写的是它可以f(x) + g(...).我很惊讶我找不到一些具体的说法.

Jon*_*ely 12

C++ 2003 5.2.2 p8

参数的评估顺序未指定.参数表达式求值的所有副作用在输入函数之前生效.未指定后缀表达式和参数表达式列表的评估顺序.

这意味着评估和评估之间没有一个序列点.f(x)args

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

[ 注意:后缀表达式和参数表达式的评估都是相对于彼此的无法排序的.在输入函数之前,对参数表达式评估的所有副作用进行排序(参见1.9).- 结束说明 ]

和1.9 p15说

当调用函数时(无论函数是否为内联函数),与任何参数表达式相关联的每个值计算和副作用,或者使用指定被调用函数的后缀表达式,都会在执行每个表达式或语句之前对其进行排序.叫功能.[ 注意:与不同参数表达式相关的值计算和副作用未被排序.- 结束说明 ]

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