我已经在Standard(n4296),23.2.3/4(表100)中看到了对序列STL容器的要求,并且已经阅读到带有参数迭代器的构造函数(X-容器,i和j-输入迭代器)

X(i, j)
X a(i, j)

要求容器的元素类型为EmplaceConstructible。
Requires: T shall be EmplaceConstructible into X from *i

我认为可以通过为范围内的每个迭代器调用std::allocator_traits::construct(m,p,* it)方法来实现构造函数(其中m-类型A的分配器,p-内存的指针,it-的迭代器[i; j],并且只需要元素的CopyInsertable概念,因为仅提供了一个用于复制/移动的参数,而EmplaceConstructible概念要求元素必须由一组参数构造。这个决定有什么理由吗?

最佳答案

CopyInsertable是一个二进制概念-给定容器X,它适用于单个类型T,该类型必须具有复制构造函数。但是,只要有一种方法(隐式地)从*i构造T,就可以将T*i设为其他类型:

  char s[] = "hello world!";
  std::vector<int> v(std::begin(s), std::end(s));
  // int is EmplaceConstructible from char

一个(人为)示例,其中T不是CopyInsertable:
struct nocopy {
  nocopy(int) {}
  nocopy(nocopy const&) = delete;
  nocopy(nocopy&&) = delete;
};
int a[]{1, 2, 3};
std::vector<nocopy> v(std::begin(a), std::end(a));

09-11 13:01