代码之家  ›  专栏  ›  技术社区  ›  Joseph Franciscus

为什么需要选择容器上的拷贝结构?

  •  1
  • Joseph Franciscus  · 技术社区  · 6 年前

    对于分配器,为什么是 select_on_container_copy_construction 需要而不是仅仅重载复制构造函数?

    当我们想要定义两个单独的复制构造实现时,是否有实例取决于我们是否要复制实际的分配器vs容器?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Kerrek SB    6 年前

    (你所指的特征实际上被称为 select_on_container_copy_construction )

    标准库容器的复制构造函数 实际上,重载并提供分配器扩展版本:

    A a1 = f(), a2 = g();  // allocators
    
    std::vector<int, A> v1(a1);
    std::vector<int, A> v2(v1, a2);  // allocator-extended copy
    std::vector<int, A> v3 = v1;     // regular copy, uses select_on_container_copy_construction
    

    但是,使用重载并不总是一个选项,而且通常,具有分配器意识的容器应该可以像不知道分配器选择一样轻松无缝地使用。这意味着某些决策,例如如何分配容器的副本,可能需要通过分配器类型直接定制,而不是通过用户的类型。

    例如,您可以想象这样一种情况:一个向量的内容都进入一个(可能是可增长的)领域,但是当您创建一个新的向量时,您希望它进入一个新的、独立的领域,并且通用代码不需要知道这一点。

    这个库功能在实践中是否有用是一个单独的问题,但希望这能说明为什么这个部件设计有一些动机。