-1

上記をどのように解釈すればよいかわかりません。

'this != rhs' の 'operator!=' に一致しません | エラー| タイプ 'Collection* {aka Collection*}' の右辺値からのタイプ 'Collection&' の非 const 参照の無効な初期化 |

1 つが別のメソッドを呼び出す 2 つのメソッドがあります。ただし、コードをそのまま実行すると、上記のエラー メッセージが表示されます。

Collection&  Collection::operator=(const Collection&& rhs)
        {
                   if (this!= rhs)// <--- Error |no match for 'operator!=' in 'this != rhs'
                    {
                        return copy(rhs);//<---Error| invalid initialization of non-const reference of type 'Collection&' from an rvalue of type 'Collection* {aka Collection*}'
                    }
                    return *this;
         }

Collection& Collection::copy(const Collection& coll)
{

}
4

3 に答える 3

2

を定義したと仮定するとoperator!=、 と言いたいでしょうif (*this != rhs)this値が等しいかどうかを確認する場合は、ポインターを逆参照する必要があります。それ以外の場合、それらがまったく同じオブジェクトであるかどうかを確認する場合 (この場合は可能性が高い)、rhswithのアドレスを取得する必要がありますthis != &rhs。このソリューションでは、任意の型のポインターで既にサポートされている 2 つのポインターを比較しているだけなので、演算子のオーバーロードは必要ありません。

于 2012-04-26T17:00:36.377 に答える
2

自己代入チェックは慣用的な C++ とは見なされなくなりました。一般的に、コピーアンドスワップより劣ります。慣用的な代入演算子は次のとおりです。

Collection& Collection::operator=(Collection rhs) {
    swap(rhs);
    return *this;
}

これは、コピー コンストラクターとムーブ コンストラクター、および関数が定義されていることを前提としていますswap。さらに、ムーブ セマンティクスが有効なクラスは、非 const 右辺値参照を取る必要があります。右辺値参照の全体的な目的は、右辺値を変更することconstです。右辺値は価値がありません。intこれは簡単な例で、例のリソースとしてヒープ割り当てを使用しています。

class Collection {
    int* ptr; // example resource
public:
    Collection(const Collection& c) {
        ptr = new int(*c.ptr); // copy
    }
    Collection(Collection&& c) {
        ptr = c.ptr; // move
        c.ptr = nullptr;
    }
    void swap(Collection& rhs) {
        std::swap(ptr, rhs.ptr); // swap
    }
    Collection& operator=(Collection rhs) {
        swap(rhs);
        return *this;
    }
    ~Collection() {
        delete ptr; // rule of three, bitch
    }
};
于 2012-04-26T17:06:49.903 に答える
1

thisでありCollection*、でrhsあるconst Collection&&。それらの間ではできません!=。viaに変換する必要がrhsあります。 const Collection*&rhs

if (this!= &rhs)

さらに良いのは、自己代入を試みても問題にならない代入演算子を作成することです。

于 2012-04-26T17:00:53.523 に答える