我正在查看有关vector::vector的cppreference文档,并且作为练习,我试图弄清楚如何实现explicit vector( const Allocator& alloc ) noexcept;
我发现问自己的问题是,为什么要将分配器传递给载体?如果分配器是多态的,这才有意义。但是,如果该组分配器具有不同的状态信息,即具有不同的大小,则会导致以下问题:
因此,鉴于这些原因,这是否意味着分配器组必须仅在基类中具有状态?还有什么我想念的吗?
答案 0 :(得分:2)
如果您没有它作为成员,则必须对其进行分配。 分配意味着它可能导致异常。
否,不必分配。要构造std::vector
的实例,只需复制构造即可。
分配器实例作为对const
的构造函数的std::vector
引用被传递。 std::vector
本身有一个Allocator
实例作为(私有)类成员,并且它是使用此参数复制构造的。
请记住,Allocator
是第二个(默认)std::vector
模板参数。因此,典型的实现将Allocator
声明为std::vector
本身的(私有)成员,因此唯一发生的分配是std::vector
本身的分配。
std::vector
的默认构造函数default构造其Allocator
类成员,该成员也是noexcept
(从C ++ 17开始)。
因此,胶囊摘要是分配器类(从C ++ 17开始)必须具有一个noexcept
复制构造函数和一个noexcept
默认构造函数,才能满足{{1} } noexcept
本身的例外要求。
在构造std::vector
实例的过程中,不需要 additional 分配(对于不将std::vector
的内容初始化为其结构)-除了std::vector
本身的分配。