簡體   English   中英

為什么采用迭代器的構造函數需要元素為EmplaceConstructible?

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

我已經在標准(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 - 指向內存的指針,它 - 迭代器in [i; j),並且只需要CopyInsertable元素的概念,因為只提供一個參數用於復制/移動,而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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM