std :: list模板在其实例类型中是否需要复制构造函数(或等效函数)?

时间:2017-06-14 16:02:59

标签: c++ c++11 stdlist deleted-functions

我有一个课程,每个实例都应该被考虑,创造和破坏要严格控制。不允许随机移动,复制,临时工作 - 一旦通过专用功能创建,实例可以被传递到#34;只能通过引用和指针。

为实现这一目标,我删除了这个班级'复制构造函数和赋值运算符。

实例意味着保存在std :: list中,由emplace_back()创建,按需删除,从不打算移动。但我收到有关已删除的复制构造函数的错误。

 In constructor 'std::_List_node<_Tp>::_List_node(_Args&& ...) 
 error: deleted function 'Reader::Reader(const Reader&) 
          stl_list.h:103: error: used here

有没有办法让这项工作? std :: list的一些替代品,我不需要手工雕刻?

1 个答案:

答案 0 :(得分:6)

标题中问题的答案是“它取决于”。

如果你的类确实有一个移动构造函数,你将能够使用移动构造函数。如果你的类没有移动构造函数,那么将使用复制构造函数。

列表中的对象必须以某种方式构造。 emplace_back使其尽可能高效,但仍需要构造一个对象。来自http://en.cppreference.com/w/cpp/container/list/emplace_back使用placement-new在容器提供的位置就地构建元素。

emplace_back的参数是另一个对象时,贴图new将最终调用复制构造函数或移动构造函数。

如果emplace_back的参数只是构造对象所需的数据,那么就不需要复制构造函数或移动构造函数。

  

有没有办法让这项工作?

如果您或您的团队关于复制构造函数和移动构造函数的策略未公开讨论,则必须使用解决方法。

解决1:

存储指向列表中对象的指针。这是最简单的工作,只要你能确保不在列表后面删除对象并使列表保持悬挂指针。

解决2:

将非指针句柄存储到列表中的对象。这将需要您的一些簿记代码。如果您可以添加以下功能:

  1. 给定指向对象的指针,获取整数值。整数值可以用作对象的非指针句柄。
  2. 获取指向先前返回句柄的对象的指针。
  3. 您可以使用句柄列表轻松管理。

    通过保留一对用构造和删除对象更新的映射,可以很容易地完成上述操作。每次创建对象时,都会向地图添加条目。每次删除对象时,都会从地图中删除条目。