Pot*_*ter 4 c++ iterator initialization
这个很好吗?
int main() {
std::deque< int >::iterator x; // Or any container.
}
Run Code Online (Sandbox Code Playgroud)
奖金问题:
auto y = x;这可能拷贝未初始化状态?… x = {};这需要一个非显式默认构造函数?x == y,如果两者都值初始化(不是默认初始化如图所示)?取决于你正在检查的迭代器概念.
如果它是一个常规的Iterator,这只是被称为迭代器的绝对最小值,那么答案是否定的,因为它必须只满足CopyConstructible,CopyAssignable和Destructible的构造性要求.(§24.2.2/ 2)
但是,大多数容器迭代器都满足BidirectionalIterator的要求(除了std::forward_list异常).所有BidirectionalIterator也满足ForwardIterator的要求,它满足InputIterator的要求(相当一口).
ForwardIterator的要求明确指出:
类或类型指针X满足前向迭代器的要求
- X满足输入迭代器的要求(24.2.3),
- X满足DefaultConstructible要求(17.6.3.1),
N3376中的§24.2.5/ 1
所以是的,这是一个有效的假设.
您可以在第24.2节中找到迭代器要求,但它们在cppreference中得到了很好的总结
是的,它们是,但它并不像它最初看起来那么明显.
如果查看§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概念的迭代器,因此它们都具有默认的可构造迭代器.