3

標準 (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 の概念のみが必要です。これは、コピー/移動に引数が 1 つしか提供されないためです。一方、EmplaceConstructible の概念では、一連の引数から要素を構築する必要があります。その決定には何か理由がありますか?

4

1 に答える 1

7

CopyInsertableはバイナリの概念です。コンテナーを指定すると、コピー コンストラクターが必要なX単一の型に適用されます。Tただし、から(暗黙的に) 構築する方法がある限り、*iとは異なる型にすることができます。TT*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));
于 2015-12-16T11:48:58.787 に答える