1

私はこの問題に頻繁に遭遇しており、ムーブ コンストラクターが適切であると考えていますが、コピー コンストラクターが問題であり、それを非表示にするとうまくいかないようです。

コード:

template <class T>
class LinkedList{
public:
    //
    LinkedList() {}
    LinkedList(const T &data);
    LinkedList(const T &data, const LinkedList &node);
    LinkedList(const LinkedList &object);
    LinkedList &operator=(const LinkedList &object);

    ~LinkedList() {}

    std::shared_ptr<LinkedList> push_back(const T& data);

private:
    T data;
    std::unique_ptr<LinkedList> link;

    std::unique_ptr<LinkedList> LinkFactory(const LinkedList &node);

    std::shared_ptr<LinkedList> CreateStartNode(const T &data);
    std::shared_ptr<LinkedList> CreateNode(const T &data, const LinkedList &node);
};

エラーが発生している特定の行は次のとおりです。

LinkedList<T>::LinkedList(const LinkedList<T> &object) : data(object.data),  
link(std::move(object.link)) {}

コピー コンストラクター内のリンクをコピーするのではなく移動しようとしていますが、役に立ちません。ムーブ コンストラクターが合成ではなく設計されている場合、そのほうがよいでしょうか?

4

4 に答える 4

5

定数オブジェクトを移動することはできませんobject。const と宣言されているため、object.linkconst も同様です。

通常、そのコンストラクターはコピーコンストラクターですが、パラメーターからリンクを移動しようとしているため、これは設計が壊れているように見えます。つまり、所有しているリソースを盗もうとしています。LinkFactory メソッドがあります。名前が約束することを行う場合は、それを使用する必要があるようです。

于 2013-02-01T15:35:48.507 に答える
3

参照を取るlvalueコンストラクターは、移動コンストラクターではなく、コピー コンストラクターです。参照が の場合const、既存のオブジェクトを変更できないため、そこから移動できません。( を削除しないでくださいconst。これは、奇妙な破壊的コピー セマンティクスを与えるためです。このような奇妙さを回避するために、移動セマンティクスが言語に追加されました)。

メンバーのためにクラスをunique_ptrコピーできないため、コピー コンストラクターをまったく提供しないでください。移動コンストラクターを提供できます。

LinkedList<T>::LinkedList(LinkedList<T> && object) : 
    data(object.data), link(std::move(object.link)) {}

ただし、暗黙的に生成された移動コンストラクターがそれを行うため、その必要はありません (唯一の違いは、データがコピーではなく移動されることです)。

通常、名前付き変数は、明示的に移動しない限り移動できないことに注意してください。

LinkedList<int> l1;
LinkedList<int> l2(l1);             // ERROR: tries to copy
LinkedList<int> l3(std::move(l1));  // OK: explicit move
于 2013-02-01T15:38:14.840 に答える
0

あなたが達成しようとしているセマンティクスは何ですか?コピー コンストラクターでは、コピーされるオブジェクトはconst(通常は正しい); その中の何かを移動しようとすると、非定数である必要があります。これは設計上の欠陥のように見えますが、そうでない場合は、リンクを作成することが解決mutable策になる可能性があります。

于 2013-02-01T15:38:33.133 に答える
0

コピー コンストラクターを次のように定義しました。unique_ptr を使用した場合、コンパイル時またはリンク エラーは発生しません。

LinkedList<T>::LinkedList(const LinkedList &other){
data = other.data;
link(std::move(other.link.get()));
}

この質問に答えてくれた皆さんに感謝します。

于 2013-02-01T19:21:13.847 に答える