为什么需要对ForwardIterators建模DefaultConstructible?

时间:2012-05-01 10:12:28

标签: c++ iterator

我似乎无法找到任何标准算法来证明默认构建ForwardIterator的要求。

是否有任何实际原因,或者我可以安全地忽略它?

2 个答案:

答案 0 :(得分:4)

对于标准算法和客户端用户来说,这是为了减轻这些迭代器的使用。

例如(请记住RandomAccessIteratorForwardIterator)的子类型:

template <class RandomAccessIterator>
  void sort ( RandomAccessIterator first, RandomAccessIterator last )
{
    RandomAccessIterator pivot, i, j;
    //do your sorting algorithm        
}

如果它们不是默认构造,则需要将它们分配给firstlast,以便进行编译。

您不需要将其设置为默认值。任何使用这种未初始化的迭代器都是不确定的。不是那样添加一些检查是不明智的,特别是在调试版本中。

不,你不应该抛出默认的构造函数。它在技术上是一致的,但许多算法会意外地失败。

答案 1 :(得分:3)

从我的草稿副本开始:

  

24.2.5转发迭代器[forward.iterators]

     

1 如果

,则类或内置类型X满足前向迭代器的要求      

[...]

     

- X满足DefaultConstructible要求(20.2.1),

然后:

  

20.2.1模板参数要求

     

2 通常,不需要默认构造函数。某些容器   类成员函数签名将默认构造函数指定为   默认参数。 T()应该是一个明确定义的表达式(8.5)(如果有的话)   使用默认参数(8.3.6)调用这些签名。

这里有两点需要注意:

  • 第一行告诉我们很少需要默认的ctor(几乎可以回答你的问题)
  • 这个要求可能暗示迭代器语义应该与指针兼容,后者是默认可构造的(读取不要破坏现有代码)。