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