10

我似乎找不到任何标准算法来证明默认构造 a 的要求ForwardIterator

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

4

2 回答 2

5

对于标准算法和客户端用户,它可以简化此类迭代器的使用。

例如(记住这RandomAccessIterator是 的子类型ForwardIterator):

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

如果它们不是默认可构造的,则需要将它们分配给firstlast仅用于编译。

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

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

于 2012-05-01T10:56:00.337 回答
3

从我的草稿副本中:

24.2.5 前向迭代器 [forward.iterators]

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

[...]

— X 满足 DefaultConstructible 要求 (20.2.1),

进而:

20.2.1 模板参数要求

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

这里有两点需要注意:

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