是标准容器的迭代器DefaultConstructible?

时间:2013-11-21 07:22:31

标签: c++ iterator initialization

这是否形成良好?

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

奖金问题:

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

2 个答案:

答案 0 :(得分: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

中得到了很好的总结。

答案 1 :(得分: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概念的迭代器,因此它们都具有默认的可构造迭代器。