使用指针向量实现move构造函数

时间:2018-11-13 14:58:55

标签: c++ c++11 move-constructor

我的课堂上有很多指针向量:

std::vector<Customer *> customers

现在,我想实现move构造函数。我发现我可以使用std::move中的std::vector。问题是我不知道是否会清除旧的向量值。请任何人向我解释一下。

我的移动构造函数:

OpenTable::OpenTable(OpenTable&& other) : BaseAction(), tableId(other.tableId)
{
    customers=std::move(other.customers);
}

2 个答案:

答案 0 :(得分:3)

您的move构造函数将执行您想要的操作,而无需清除任何内容

std::move()开始std::vector之后,旧向量将具有0个元素,并且没有为其分配动态内存。新构建的向量占用了该内存。无需清除任何元素。

但是,也应该这样说:

  

我的课堂上有很多指针向量:

这是一个错误...我们不再使用C ++ 98。原始指针不指示谁拥有内存,也不指示对象在该地址的寿命。现在,您可能正确,但可能不正确。那么您的代码的未来维护者呢?最好不要碰碰运气:请改用smart pointer。或者-只需将实际对象放置在向量中即可。就像评论所暗示的那样,如果您要移动而不是复制矢量,则不会为相同的对象制作多余的副本。

Resource Management section of the C++ Core Programming Guidelines中有关此点的更多信息。

答案 1 :(得分:2)

  

问题是我不知道它是否会清除旧的向量值。

保证将向量从其移出后为空。

customers=std::move(other.customers);

与其默认构造该成员然后进行移动分配,不如直接在成员初始化列表中移动该成员:

OpenTable::OpenTable(OpenTable&& other) : ..., customers(std::move(other.customers))

尽管看起来很像您的构造函数与隐式move构造函数没有什么不同,所以您可以改用:

OpenTable::OpenTable(OpenTable&&) = default;

更好的是,取决于类的其余部分,可以隐式声明move构造函数,因此您甚至不需要该默认声明。