這是否形成良好?是標準容器的迭代器DefaultConstructible?
int main() {
std::deque<int>::iterator x; // Or any container.
}
獎金的問題:這可能副本未初始化狀態
- 什麼
auto y = x;
? … x = {};
需要一個非顯式的默認構造函數呢?x == y
如果兩者都進行了值初始化(沒有默認初始化,如圖所示)?
這是否形成良好?是標準容器的迭代器DefaultConstructible?
int main() {
std::deque<int>::iterator x; // Or any container.
}
獎金的問題:這可能副本未初始化狀態
auto y = x;
?… x = {};
需要一個非顯式的默認構造函數呢?x == y
如果兩者都進行了值初始化(沒有默認初始化,如圖所示)?取決於您檢查的Iterator概念。
如果它是一個普通的Iterator
,它只是被稱爲迭代器的絕對最小值,那麼答案是否定的,因爲它只能滿足CopyConstructible,CopyAssignable和Destructible的可構造性要求。 (§24.2.2/2)
然而,大多數容器迭代器都符合BidirectionalIterator的要求(除了std::forward_list
,這是一個異常)。所有BidirectionalIterators也都符合ForwardIterator的要求,它符合InputIterator的要求(相當滿意)。
爲ForwardIterator明確狀態的要求:
一個類或指針類型X SATIS音響ES要求的向前 迭代如果
- X SATIS音響ES一個輸入迭代 的(要求24.2.3 ),
- X SATIS音響ES的可缺省要求 (17.6.3.1),
§24.2.5/ 1 in N3376
所以是的,這是一個有效的假設。
您可以在§24.2迭代器的要求,但他們很好地總結了cppreference
啊。該條款還規定:「然而,值初始化迭代器可能會進行比較,並應與其他值相同類型的值初始化迭代器進行比較。」超! – Potatoswatter
是的,他們是,但它是不那麼明顯,因爲它似乎是第一次。
如果你看§24.2.2[iterator.iterators](n3485),Iterator
(一般)不需要是DefaultConstructible
。此外,查看§24.2.3[input.iterators]和$ 24.2.4 [output.iterators],InputIterator
和OutputIterator
也不是。
一旦我們得到§24.2.5[forward.iterators]雖然:
1/A類或指針類型X滿足正向迭代器的要求,如果
- X滿足以輸入迭代器的要求(24.2.3),
- X滿足DefaultConstructible要求(17.6.3。1) [...]
而且由於所有的標準集裝箱具有滿足ForwardIterator
概念迭代器,它們都具有缺省構造的迭代器。
要回答這些獎勵問題:1.如果y = x'由於默認初始化的對象可能包含未初始化的成員而進行了值初始化,那麼它們纔是確定的;還參見第3條回答引用的條款; 2.'= {}'不能保證,因爲它不包含在DefaultConstructible中,我將根據C++標準提交缺陷報告; 3.看到對拉普茨答案的評論。 – Potatoswatter