是标准容器DefaultConstructable的迭代器

Are iterators of standard containers DefaultConstructible?

本文关键字:迭代器 DefaultConstructable 标准      更新时间:2023-10-16

这是正规的吗?

int main() {
    std::deque< int >::iterator x; // Or any container.
}

奖励问题:

  • auto y = x;可能会复制未初始化的状态,该怎么办
  • 那么… x = {};需要一个非显式的默认构造函数呢
  • 如果两者都是值初始化的(而不是如图所示的默认初始化),那么x == y

取决于您正在检查的迭代器概念。

如果它是一个正则Iterator,它只是被称为迭代器的绝对最小值,那么答案是否定的,因为它只需要满足CopyConstructable、CopyAssignable和Destrucable的可构造性要求。(§24.2.2/2)

然而,大多数容器迭代器都满足双向迭代器的要求(除了std::forward_list,它是一个异常)。所有BidirectionalIterator反过来也满足ForwardIterator的要求,这满足了InputIterator(相当麻烦)的要求。

ForwardIterator的要求明确说明:

类或指针类型X满足前锋的要求迭代器如果

--X满足输入迭代器的要求(24.2.3),

--X满足默认可施工要求(17.6.3.1),

N3376 中的§24.2.5/1

所以,是的,这是一个有效的假设。

您可以在§24.2中找到迭代器需求,但它们在cppreference

中得到了很好的总结

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

如果您查看§24.2.2[i迭代器.iterators](n3485),则Iterator(通常)不需要是DefaultConstructible。此外,看看§24.2.3[input.iterators]和$224.2.4[output.iterators],InputIteratorOutputIterator都不是。

一旦我们到达§24.2.5[转发迭代器]:

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

  • X满足输入迭代器(24.2.3)的要求
  • X满足默认可施工要求(17.6.3.1)[…]

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