这是否形成良好?
int main() {
std::deque< int >::iterator x; // Or any container.
}
奖金问题:
auto y = x;
呢?… x = {};
呢?x == y
都是值初始化(未按图示默认初始化),那么该怎么办?答案 0 :(得分:8)
取决于您正在检查的迭代器概念。
如果它是一个常规Iterator
,这只是被称为迭代器的绝对最小值,那么答案是否定的,因为它必须只满足CopyConstructible,CopyAssignable和Destructible的可构造性要求。 (§24.2.2/ 2)
但是大多数容器迭代器都满足BidirectionalIterator的要求(std::forward_list
除外,这是一个异常)。所有BidirectionalIterator也符合ForwardIterator的要求,满足InputIterator的要求(非常满口)。
ForwardIterator的要求明确说明:
N3376中的类或指针类型X满足前锋的要求 迭代器,如果
- X满足输入迭代器的要求 (24.2.3),
- X满足DefaultConstructible要求 (17.6.3.1),
§24.2.5/ 1
是的,这是一个有效的假设。
您可以在§24.2中找到迭代器要求,但它们在cppreference
中得到了很好的总结。答案 1 :(得分:5)
是的,它们是,但它并不像它最初看起来那么明显。
如果查看§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 /如果
,则类或指针类型X满足前向迭代器的要求
- X满足输入迭代器(24.2.3),
的要求- X满足DefaultConstructible要求(17.6.3.1) [...]
由于所有标准容器都具有满足ForwardIterator
概念的迭代器,因此它们都具有默认的可构造迭代器。