【发布时间】:2013-02-01 15:28:57
【问题描述】:
我经常遇到这个问题,我相信移动构造函数是有序的,但我认为复制构造函数是问题所在,隐藏它似乎不起作用。
代码:
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)) {}
我试图移动而不是复制复制构造函数中的链接,但无济于事。如果移动构造函数是设计而不是合成的,那会更好吗?
【问题讨论】:
-
由于有复制构造函数,编译器不会合成移动构造函数
-
如果使用复制构造函数定义移动构造函数,“有时”将调用移动构造函数。那么最好简单地定义和隐藏复制构造函数的实现吗? @dribeas 如果我没有定义复制构造函数,那么会为我合成一个并成为问题,对吗?
-
正确,您需要您的复制构造函数。我只是说拥有一个复制构造函数会抑制移动构造函数的隐式声明,因此您需要声明和定义它(即使定义是普通的
= default,在您的情况下应该可以工作)。这解决了您的错误消息,但留下了复制构造函数是否应该窃取源代码内容的问题,嗯......不是那么多:它不应该。 -
很遗憾,我使用的是 VS10,所以不支持
= delete和= default。
标签: c++ c++11 copy-constructor unique-ptr move-constructor