2 c++
说我有以下电话:
o->f( x, y )
Run Code Online (Sandbox Code Playgroud)
被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 );
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果c不是指针而是一些提供重载++和->运算符的对象,是否会发生任何变化?
选择函数(c->foo或(c++)->foo)和函数参数的后缀表达式都在调用函数之前进行求值,并且在评估所有参数之后并且在函数体输入之前有一个序列点,因此理论上可以保证在foo进入尸体之前,两种情况都会完成副作用.
但是,在评估任何函数参数或指定this对象的后缀表达式和要调用的函数之间没有序列点,因此在两种情况下它都是未定义的行为,因为单独的评估c- 是否用于" this"参数或正常函数参数 - 不受c++其他参数副作用结果的序列点的"保护" .
5.2.2 [expr.call]:
参数的评估顺序未指定.参数表达式求值的所有副作用在输入函数之前生效.未指定后缀表达式和参数表达式列表的评估顺序.