说我有以下电话:
o->f( x, y )
o
保证在x
和y
之前进行评估,或者o
被认为是普通参数,因此会在某个未定义的点进行评估在控件进入x
之前 y
和f
?
基本上,this
中的c
和C::Foo
的值是Func1
还是Func2
中的明确定义,还是经典Foo( i++, i++, i++ )
变相问题?
class C
{
public:
void Foo( C *c );
};
void Func1( C *c )
{
c->foo( c++ );
}
void Func2( C *c )
{
(c++)->foo( c );
}
编辑:如果c
不是指针而是某个提供重载++
和->
运算符的对象,会发生什么变化吗?
答案 0 :(得分:7)
选择函数(c->foo
或(c++)->foo
)的后缀表达式和函数参数都在调用函数之前进行求值,并且在评估所有参数之后有一个序列点输入函数体,理论上可以保证在输入foo
的主体之前,两种情况都会完成副作用。
但是,在评估任何函数参数或指定this
对象的后缀表达式和要调用的函数之间没有序列点,所以在这两种情况下它都是未定义的行为,因为评估了孤独c
- 无论是用于“this
”参数还是普通函数参数 - 都不会被c++
对另一方的副作用结果的序列点“保护”参数。
5.2.2 [expr.call]:
参数的评估顺序未指定。参数表达式求值的所有副作用在输入函数之前生效。 未指定后缀表达式和参数表达式列表的评估顺序。