int& foo() {
printf("Foo\n");
static int a;
return a;
}
int bar() {
printf("Bar\n");
return 1;
}
void main() {
foo() = bar();
}
最初に評価する必要があるかどうかはわかりません。代入演算子のC++関数評価順序
私はVCでバー機能を最初に実行しようとしました。しかし、g ++(FreeBSD)によるコンパイラでは、最初に評価されたfoo関数を出力します。
多くの興味深い質問は、上記の問題から派生し、私は前の結果に基づいて、動的な配列(のstd ::ベクトル)
std::vector<int> vec;
int foobar() {
vec.resize(vec.size() + 1);
return vec.size();
}
void main() {
vec.resize(2);
vec[0] = foobar();
}
があると、VCは(foobarのを評価し)、その後、ベクトルを行いますオペレーター[]。そのような場合には問題ありません。しかし、gccではvec [0]が評価されているので、foobar()関数は配列の内部ポインタを変更する可能性があります。 vec [0]は、foobar()の実行後に無効にすることができます。
は、それは我々が評価の
void main() {
vec.resize(2);
int a = foobar();
vec[0] = a;
}
+2、これは興味深い質問です。それは私が以前考えたことがないものです。とにかくそのようなコードを使用し始めると明らかにあなたは困っています:) –
+1。それは本当に面白い質問です。それ以上に質問は非常にきれいに聞かれます。よく書かれた質問。 – Nawaz
私はこの今日の興味深い例を見つけました: 'auto_ptr p(new int); smart_map m; 'smart_map :: operator []'が投げる可能性があるとすれば、 'auto_ptr'が所有権を解放しても、マップは所有権を引き継ぐことはできません。 RHSがLHSの前に評価されるケース。 ( 'smart_map'はSTL' map'と似ていますが、破壊時に各キーと値のペアのポインタ値を削除することを除けば) –
mrkj