繁体   English   中英

C ++ 11是否改变了STL容器元素的要求,以及如何?

[英]Has C++11 changed requirements for elements of STL containers, and how?

最近我很惊讶std::unique_ptr对于STL容器的元素是可以接受的 ,因为我认为这些元素需要提供下面的函数( 这个页面说的相同):

  • 没有参数的公共默认构造函数
  • 公共复制构造函数
  • 公共复制分配操作员功能
  • 公共析构函数

但是std::unique_ptr是不可复制的,使得它所拥有的指针由单个对象拥有,这与上述要求相矛盾。

标准是否改变了要求? 如果是这样,有什么变化? 也许可移动物体或可复制物体都足够了? 我在网上搜索了自C ++ 11以来需求是否发生了变化,但我找不到任何帮助我的页面...

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

std::vector通常只需要其成员为MoveConstructibleMoveAssignable std :: vector有许多成员函数,它们要求更严格。 vector::push_back需要Move CopyConstructible (取决于你是否传递rvalue或lvalue),但是new vector::emplace_back只要求有一个可访问的构造函数来获取给定的参数(除了基线要求之外)。 显然,任何调用vector的复制构造函数/赋值的尝试都要求类型为CopyConstructible(即:您不能复制std::vector<unique_ptr> )。

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

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

简而言之,要求不那么严格,但它们有点复杂。 如果限制自己对容器执行某些操作,则可以使用很多东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM