是标准容器的迭代器DefaultConstructible?

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,如果两者都值初始化(不是默认初始化如图所示)?

Rap*_*ptz 8

取决于你正在检查的迭代器概念.

如果它是一个常规的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中得到了很好的总结


Mat*_* M. 5

是的,它们是,但它并不像它最初看起来那么明显.

如果查看§24.2.2[iterator.iterators](n3485),Iterator则不需要(通常)DefaultConstructible.此外,查看§24.2.3[input.iterators]和$ 24.2.4 [output.iterators],两者都不是InputIteratorOutputIterator.

一旦我们得到§24.2.5[forward.iterators]:

1 /类或指针类型X满足前向迭代器的要求

  • X满足输入迭代器的要求(24.2.3),
  • X满足DefaultConstructible要求(17.6.3.1)[...]

由于所有标准容器都具有满足ForwardIterator概念的迭代器,因此它们都具有默认的可构造迭代器.