1

重複の可能性:
Microsoft VS C++ コンパイラが一時オブジェクトからの参照を初期化できるのはバグですか?

#include <iostream>
#include <string>
using namespace std;
class test
{
public:
    string a;
public:
    test(string b){a=b;}
    friend string operator+(test);
};
string operator+(string &c,test a)
{
    c=c+a.a;
    return c;
}
void main()
{
    test d("the ");
    test e("world!");
    string s="Hello ";
     s=s+d+e;
    cout<<s<<endl;
}

最後から 2 番目の行s=s+d+e; 最初のオーバーロードされた演算子 + の後、一時オブジェクトが返され、2 番目のオーバーロードされた演算子 + が予期せず機能しました!しかし、演算子 + 関数の最初のパラメーターは参照です。ここで一時オブジェクトの参照が有効なのはなぜですか、それとも見逃したことがありますか?

PS: VC++6.0 でコンパイルされており、実行結果は次のとおりです。ここに画像の説明を入力

4

1 に答える 1

1

一時オブジェクトは、それらが作成された完全式の終わりまで、大まかに言えば、;行の終わりまで存続します。それらへの参照は、その時点まで有効です。

ただし、それを非const参照にバインドするのは有効ではありません。コンパイルされる唯一の理由は、コンパイラが 15 年以上前のものであり、それ以降、言語に 2 つの大きな変更が加えられているためです。このミレニアムのコンパイラの 1 つにアップグレードすることをお勧めします。

于 2012-04-10T12:30:10.440 に答える