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

时间:2011-02-08 22:19:57

标签: c++

说我有以下电话:

o->f( x, y )

o保证在xy之前进行评估,或者o被认为是普通参数,因此会在某个未定义的点进行评估在控件进入x之前 yf

基本上,this中的cC::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不是指针而是某个提供重载++->运算符的对象,会发生什么变化吗?

1 个答案:

答案 0 :(得分:7)

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

但是,在评估任何函数参数或指定this对象的后缀表达式和要调用的函数之间没有序列点,所以在这两种情况下它都是未定义的行为,因为评估了孤独c - 无论是用于“this”参数还是普通函数参数 - 都不会被c++对另一方的副作用结果的序列点“保护”参数。

5.2.2 [expr.call]:

  

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