なぜ連鎖静的関数とメンバ関数の間に引数の評価順序に違いがあるのか不思議です。 this questionの回答から、そのような連鎖関数呼び出しの間で引数の評価順序が何であるかは不明です。しかし、私は思っていた場合GCC 4.6.2及びCL 15.00.30729.01(MSVC 9)の場合に得られる出力は私連鎖静的関数呼び出し間の引数評価順序
5 5 5
3 4 5
するためのものである
#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;
}
:例えば、次のコードを取ります仕様に何らかの理由がある、あるいは静的関数が左から右へ(引数で)評価され、非静的関数からすべての引数が最初から(右から左へ他のテストで見たように)。
これは、構造体と関数ポインタを使用してCで同様の動作をさせようとしたときに、この動作の違いが最初に気付き、失敗したためです。私はこれがGCCとMSVCの両方でメンバー関数のために実装されたいくつかの最適化だと強く思っていますが、ここで誰かがこれについてもう少し詳しく説明してくれることを願っています。
編集:
Iが奇数として私を打つ情報の一つの重要なビットを言及するのを忘れてしまった:GCCは静的関数の連鎖非静的関数に指定されていない行動に警告ではなくなります。
a.cpp: In function 'int main(int, char**)':
a.cpp:18:45: warning: operation on 'x' may be undefined [-Wsequence-point]
GCCは、2番目の表現を見逃す可能性があるような警告を出す義務はありませんが、これは興味深いことが起こっていると私に導きます。
あなたが書いたコードでこのようなことは無関係でなければなりません。 –
はい、私はいくつかのコードに誤りがありますが、同様の場合には警告を出さない理由を知りたいと思います。 – harrbharry