为什么采用迭代器的构造函数要求元素是 EmplaceConstructible?

Why does a constructor which takes iterators require elements to be EmplaceConstructible?

我已经在标准 (n4296)、23.2.3/4 (Table 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 - 指向内存的指针,它- [i; j) 中的迭代器,并且只需要元素的 CopyInsertable 概念,因为只为 copying/moving 提供了一个参数,而 EmplaceConstructible 概念需要从一组参数构造元素。做出该决定有什么原因吗?

CopyInsertable 是一个二进制概念 - 给定一个容器 X 它适用于单个类型 T,它需要有一个复制构造函数。但是,*i 可以是与 T 不同的类型,只要有办法(隐含地)从 *i:

构造 T
  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));