[英]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.