1. ホーム
  2. c++

なぜコピー代入演算子は、参照/CONST参照を返さなければならないのですか?

2023-10-09 07:20:53

疑問点

C++で、コピー代入演算子から参照を返すという概念が不明です。なぜコピー代入演算子は新しいオブジェクトのコピーを返すことができないのでしょうか。さらに、もし私がクラス A というクラスがあり、以下のように

A a1(param);
A a2 = a1;
A a3;

a3 = a2; //<--- this is the problematic line

operator= は以下のように定義されています。

A A::operator=(const A& a)
{
    if (this == &a)
    {
        return *this;
    }
    param = a.param;
    return *this;
}

どのように解決するのですか?

厳密に言えば、コピー代入演算子の結果は参照を返す必要はありませんが、C++ コンパイラが使用するデフォルトの動作を模倣するために、代入先のオブジェクトへの nononst 参照を返す必要があります (暗黙的に生成されたコピー代入演算子は nononst 参照を返します - C++03: 12.8/10)。 を返すコードをかなり見てきました。 void を返すコードをかなり見てきましたが、それが深刻な問題を引き起こしたことは記憶にありません。 返り値 void を返すと、ユーザが「代入の連鎖」( a = b = c; を使用することを禁止し、例えばテスト式で代入の結果を使用することを禁止します。この種のコードは決して前代未聞ではありませんが、特に非プリミティブ型(iostreams のように、クラスのインターフェイスがこの種のテストを意図していない限り)においては、特に一般的であるとは思えません。

私はあなたがこれを行うことを推奨しているわけではなく、それが許可されていることと、多くの問題を引き起こしていないように見えることを指摘しているだけです。

これらの他のSOの質問は、あなたが興味を持つかもしれない情報/意見を持っている関連した(おそらく全く重複していない)質問です。