我似乎找不到任何标准算法来证明默认构造 a 的要求ForwardIterator
。
是否有任何实际原因,或者我可以安全地忽略它?
对于标准算法和客户端用户,它可以简化此类迭代器的使用。
例如(记住这RandomAccessIterator
是 的子类型ForwardIterator
):
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last )
{
RandomAccessIterator pivot, i, j;
//do your sorting algorithm
}
如果它们不是默认可构造的,则需要将它们分配给first
或last
仅用于编译。
您不需要将其设置为默认值。这种未初始化的迭代器的任何使用都是未定义的。并不是说添加一些检查是不明智的,尤其是在调试版本中。
不,你不应该抛出默认构造函数。它在技术上是一致的,但许多算法会意外失败。
从我的草稿副本中:
24.2.5 前向迭代器 [forward.iterators]
1类或内置类型 X 满足前向迭代器的要求,如果
[...]
— X 满足 DefaultConstructible 要求 (20.2.1),
进而:
20.2.1 模板参数要求
2通常,不需要默认构造函数。某些容器类成员函数签名将默认构造函数指定为默认参数。如果使用默认参数 (8.3.6) 调用其中一个签名,则 T() 应是定义明确的表达式 (8.5)。
这里有两点需要注意: