是的,标准库容器的要求发生了重大变化。很难提供一个完整的列表(有很多),但这里有一些重要的:
std::vector
通常只要求其成员为MoveConstructible和MoveAssignable。std::vector 的许多成员函数提出了更严格的要求。vector::push_back
需要 Move或 CopyConstructible(取决于您传递的是右值还是左值),但 newvector::emplace_back
只要求有一个可访问的构造函数,该构造函数采用给定的参数(除了基线要求之外)。显然,任何调用vector
' 的复制构造函数/赋值的尝试都需要类型是 CopyConstructible (即:您不能复制 a std::vector<unique_ptr>
)。
同样,大多数其他容器都减少了对类型的限制。它们还具有emplace
允许您就地构造成员的成员函数,以及 l/rvalue 插入函数。这意味着您不必复制值;您可以将它们移入或就地构建它们。
构造函数或析构函数都不需要是公共的;所有的构建都是通过调用调用来进行的allocator_traits<Allocator>::construct
。因此,如果您提供分配器,您可以将构造函数/析构函数设为私有。好吧,当然,只要您的分配器类可以访问它们。
简而言之,要求不那么严格,但要复杂一些。如果你限制自己对容器执行某些操作,你可以逃脱很多事情。