0

オーバーロードされた代入演算子から参照が返され、演算子の連鎖が有効になっていることを読みました。しかし、そのリターンがなくても、演算子チェーンは機能しているようです。

誰かがこれに光を当てることができますか?

class A
{
    public:
        int x,y;
        char* str;

        //Default Constructor
        A(){}

        //Constructor
        A(int a, int b, char* s){
            cout<<"initialising\n";
            x = a;
            y = b;
            str = new char[10];
            str = s;
        }

        //Destructor
        ~A(){}

        //Overloaded assignment operator
        const A& operator=(const A& obj)
        {
            cout<<"Invoking Assignment Operator\n";
            x = obj.x;
            y = obj.y;
            str = new char[10];
            str = obj.str;

            //return *this;
        }
};

ostream& operator<<(ostream& os, const A& obj)
{
    os <<"X="<< obj.x<<" Y="<<obj.y<<" Str="<<obj.str<<"\n";
    return os;
}

int main()
{
    A c(3,4,"Object C");
    cout<<c;

    A d, e, f;
    d = e = f = c;  //Assignment operator invoked 3 times
    cout<<e;
}

出力:

initialising
X=3 Y=4 Str=Object C
Invoking Assignment Operator
Invoking Assignment Operator
Invoking Assignment Operator
X=3 Y=4 Str=Object C
4

2 に答える 2

3

期待される戻り値の型が isであり、何も返さないため、未定義の動作が発生しています。operator =const A&

それがあなたのために働くのは不運です。(はい、不運です。動作しているように見える未定義の動作が最悪なので)

MSVS でコンパイル エラーが発生し、ideone.com でランタイム エラーが発生します。

http://ideone.com/xTDb6

于 2012-04-30T07:54:37.097 に答える
2

このルールは、次のようなコードから生まれました。

struct Foo { 
    Foo& copy(const Foo& x) { 
        return (*this = x); 
    } 
};

当時、C++ に関して次の 2 つの点が異なっていました。

  1. コンパイラによって生成された operator= は、デフォルトで右辺値を返しました。
  2. コンパイラは、非 const 参照が一時にバインドすることを許可しました。

上記のコードは、次と同等になるように意図されていました。

*this = x;
return *this;

しかし、そうではありませんでした-operator=右辺値を返したため、コンパイラは割り当ての結果を保持する一時を生成し、関数は参照を返したため、その一時への参照を返しました。その後、もちろん、事態は急いでうまくいきませんでした。これは、作成された完全な式の最後で破棄された一時オブジェクトへのぶら下がっている参照があったためです。要するに、ローカルへの参照を返すクラスのケースですが、返される参照は言うまでもなく、ローカルがまったく生成されていることを認識するのにかなりの分析が必要でした。

参照ではなく値を返すように定義した場合operator=、コンパイラが上記のコードで行ったように、一時的なものを生成する必要があります。現在の言語の他の変更がこのような場合にあなたを保護するのに十分であるかどうかを判断するために残りを詳細に考えていませんが、私の即時の反応は、あなたがその古代のバグを再構成するのに約半分であるということです.ですから、あなたがどうしようもない場合を除いて、私は離れていたいと思います。

于 2012-04-30T08:20:49.003 に答える