26

最近我std::unique_ptr对 STL 容器的元素可以接受这一事实感到惊讶,因为我认为这些元素是提供以下功能所必需的(此页面也是如此):

  • 没有参数的公共默认构造函数
  • 公共复制构造函数
  • 公共拷贝赋值运算符函数
  • 公共析构函数

但是std::unique_ptr不可复制以使其持有的指针归单个对象所有,这与上述要求相矛盾。

标准是否改变了要求?如果有,有哪些变化?也许可移动对象或可复制对象就足够了?我已经在网上搜索了自 C++11 以来要求是否发生了变化,但我找不到任何对我有帮助的页面......

4

1 回答 1

24

是的,标准库容器的要求发生了重大变化。很难提供一个完整的列表(有很多),但这里有一些重要的:

std::vector通常只要求其成员为MoveConstructibleMoveAssignable。std::vector 的许多成员函数提出了更严格的要求。vector::push_back需要 Move CopyConstructible(取决于您传递的是右值还是左值),但 newvector::emplace_back只要求有一个可访问的构造函数,该构造函数采用给定的参数(除了基线要求之外)。显然,任何调用vector' 的复制构造函数/赋值的尝试都需要类型是 CopyConstructible (即:您不能复制 a std::vector<unique_ptr>)。

同样,大多数其他容器都减少了对类型的限制。它们还具有emplace允许您就地构造成员的成员函数,以及 l/rvalue 插入函数。这意味着您不必复制值;您可以将它们移入或就地构建它们。

构造函数或析构函数都不需要是公共的;所有的构建都是通过调用调用来进行的allocator_traits<Allocator>::construct。因此,如果您提供分配器,您可以将构造函数/析构函数设为私有。好吧,当然,只要您的分配器类可以访问它们。

简而言之,要求不那么严格,但要复杂一些。如果你限制自己对容器执行某些操作,你可以逃脱很多事情。

于 2012-11-27T06:13:15.893 回答