在调用成员函数时,何时评估'this'参数?

2 c++

说我有以下电话:

o->f( x, y )
Run Code Online (Sandbox Code Playgroud)

o保证之前评估xy,或被o认为是一个普通的参数,因此在一些未定义点评价沿着 xy控制通入之前,f

基本上,是的值thiscC::Foo将要在被良好限定任一Func1Func2,或者这是经典的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不是指针而是一些提供重载++->运算符的对象,是否会发生任何变化?

CB *_*ley 7

选择函数(c->foo(c++)->foo)和函数参数的后缀表达式都在调用函数之前进行求值,并且在评估所有参数之后并且在函数体输入之前有一个序列点,因此理论上可以保证在foo进入尸体之前,两种情况都会完成副作用.

但是,在评估任何函数参数或指定this对象的后缀表达式和要调用的函数之间没有序列点,因此在两种情况下它都是未定义的行为,因为单独的评估c- 是否用于" this"参数或正常函数参数 - 不受c++其他参数副作用结果的序列点的"保护" .

5.2.2 [expr.call]:

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

  • 为什么害怕?在这里依靠评估顺序并没有什么好的理由.`(c ++) - > f(c)`并不是写出你打算做的任何事情的最清晰的方式.无论如何,你要更好地表达你的意图,我想不出任何你可能意味着不可能用不同方式表达的东西. (3认同)