最近我很惊讶std::unique_ptr
STL容器的元素是可以接受的,因为我认为这些元素需要提供以下功能(这个页面说的相同):
但是std::unique_ptr
不能复制使它所拥有的指针由单个对象拥有,这与上述要求相矛盾.
标准是否改变了要求?如果是这样,有什么变化?也许可移动物体或可复制物体都足够了?我在网上搜索了自C++ 11以来需求是否发生了变化,但我找不到任何帮助我的页面...
Nic*_*las 23
是的,标准库容器的要求发生了重大变化.很难提供一个全面的清单(有很多),但这里有一些重要的清单:
std::vector
通常只要求其成员为MoveConstructible和MoveAssignable.std :: vector有许多成员函数,它们要求更严格.vector::push_back
需要Move 或 CopyConstructible(取决于您是否传递rvalue或左值),但new vector::emplace_back
只要求有一个可访问的构造函数来获取给定的参数(除了基线要求之外).显然,任何调用vector
复制构造函数/赋值的尝试都要求类型为CopyConstructible(即:您不能复制a std::vector<unique_ptr>
).
同样,大多数其他容器减少了对类型的限制.它们还具有emplace
成员函数,允许您就地构造成员,以及l/rvalue插入函数.这意味着您不必复制值; 你可以将它们移动或就地构建它们.
任何建造者或破坏者都不需要公开; 所有施工都通过拨打allocator_traits<Allocator>::construct
电话进行.因此,如果您提供分配器,则可以将构造函数/析构函数设置为私有.好吧,只要您的分配器类可以访问它们,当然.
简而言之,要求不那么严格,但它们有点复杂.如果限制自己对容器执行某些操作,则可以使用很多东西.