2011-02-08 85 views
2

說我有以下電話:調用成員函數時何時評估'this'參數?

o->f(x, y) 

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); 
} 

編輯:沒有任何改變,如果c不是指針而是一個提供過載++->運營商的一些對象?

+0

「o」可能永遠不會被訪問 – 2011-02-08 22:23:01

回答

7

選擇函數(c->foo(c++)->foo)和函數參數的後綴表達式在函數被調用之前進行評估,並且在所有參數評估之後以及緊接在函數體輸入之前都有一個序列點,所以您理論上可以保證在輸入foo的主體之前在兩種情況下都會完成副作用。

但是,在任何函數參數的評估或指定對象的後綴表達式和要調用的函數之間沒有順序點,因爲在兩種情況下,它都是未定義的行爲,因爲評估單獨的c - 不管是否用於「this」參數或正常功能參數 - 對於其他參數而言,c++的副作用結果都不由序列點「保護」。

5.2.2 [expr.call]:

的參數評價的順序是不確定的。參數表達式評估的所有副作用在輸入函數之前生效。 未指定後綴表達式和參數表達式列表的評估順序。

+0

是的。這就是我害怕的...... – nop 2011-02-08 22:28:54