【发布时间】:2013-02-16 11:53:54
【问题描述】:
如果我写f(x)->g(args, ...),我可以依赖f(x)之后的序列点,然后再评估args, ...吗?我可以看到两种方式的论点:
- §1.9.17 “当调用函数时(无论该函数是否内联),在所有函数参数(如果有)的评估之后都有一个序列点,该序列点发生在执行任何表达式或语句之前函数体。在复制返回值之后和函数外的任何表达式执行之前还有一个序列点。"
- 另一方面,对象指针隐含地是一个隐藏参数
this,就好像我写了g(f(x), args, ...),这表明它就像一个参数,因此未指定。
-> 运算符不是普通的二元运算符,因为很明显g(...) 不能在f(x) 之前评估,就像我写f(x) + g(...) 一样。我很惊讶我找不到关于它的具体说明。
【问题讨论】:
-
->是二元运算符吗?如果忽略它的外观,它看起来就像一个返回指向某种类型的指针的一元运算符。 -
@Yakk:它是一个一元运算符,但 n-ary (某种意义上)是
T::g,它采用隐式this和args.问题是产生隐式this的表达式是否在评估成员函数g的其余参数之前排序 -
看起来像it's not。
标签: c++ sequence-points unspecified-behavior