我很好奇爲什麼在鏈接靜態函數和成員函數之間的參數計算順序的差別。從this question的答案我可以看出它沒有說明在這樣的鏈接函數調用之間參數評估順序是什麼。舉個例子下面的代碼片斷:評估順序調用
#include <iostream>
class test {
public:
static test& chain_s(test& t, int i) {
std::cout << i << " ";
return t;
}
test& chain(test& t, int i) {
std::cout << i << " ";
return *this;
}
};
int main(int, char**) {
int x = 2;
test t;
t.chain(t,++x).chain(t,++x).chain(t,++x);
x = 2; std::cout << std::endl;
t.chain_s(t,++x).chain_s(t,++x).chain_s(t,++x);
return 0;
}
在GCC 4.6.2和CL 15.00.30729.01(MSVC 9)的情況下所得到的輸出是對我
5 5 5
3 4 5
然而,我想知道是否在說明書中有任何理由,或者如果以其他方式知道爲什麼靜態函數是從左到右(使用它們的參數)進行求值,並且對於非靜態函數,所有參數都是第一個(從我的右向左在其他測試中見過)。
我之所以這麼問,這是因爲我試圖讓用C類似的行爲(使用結構和函數指針)時,第一次注意到這種行爲差異和失敗。我強烈懷疑這是在GCC和MSVC中針對成員函數實現的一些優化,但是我希望這裏有人能夠在這方面多一點點亮。
編輯:
我忘了提及的信息的一個關鍵位,它令我奇怪:GCC將只警告上鍊接的非靜態函數不確定的行爲,而不是靜態函數:
a.cpp: In function 'int main(int, char**)':
a.cpp:18:45: warning: operation on 'x' may be undefined [-Wsequence-point]
GCC沒有義務提供這樣的警告,因此可能會錯過第二個表達式,但是這是使我相信一些有趣的事情是怎麼回事。
肯定這樣的事情應該是不相關的任何代碼,你寫... – 2012-01-17 19:38:00
是的,但我想知道爲什麼一些代碼是錯誤的,但不會產生警告,當在類似的情況下,它會。 – harrbharry 2012-01-17 19:48:57