我似乎找不到任何标准算法可以说明需要默认构造一个 ForwardIterator
的要求。
是否有任何实际原因需要这样做,或者我可以安全地忽略它?
我似乎找不到任何标准算法可以说明需要默认构造一个 ForwardIterator
的要求。
是否有任何实际原因需要这样做,或者我可以安全地忽略它?
这是为了方便使用这些类型的迭代器,无论是标准算法还是客户端用户。
例如(请记住,RandomAccessIterator
是 ForwardIterator
的子类型):
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last )
{
RandomAccessIterator pivot, i, j;
//do your sorting algorithm
}
first
或last
才能使其编译。RandomAccessIterator
模拟DefaultConstructible
的参数,而不是ForwardIterator
。虽然InputIterator
不需要模拟DefaultConstructible
,但为什么要模拟ForwardIterator
呢? - AyjayForwardIterator partition_point(ForwardIterator first, ForwardIterator last, Predicate pred)
中,而这可以很容易地避免。 - rodrigoadjacent_find
和 unique
中也使用了它,这是可以避免的。多么令人沮丧啊,为了迎合标准中的一个错误而被要求向迭代器添加对无效状态的支持。叹气,C++标准再次出击。 - Ayjay从我的草稿中看到:
24.2.5 前向迭代器 [forward.iterators]
1 如果一个类或内置类型 X 满足以下条件,则它满足前向迭代器的要求:
[...]
— X 满足可默认构造的要求(20.2.1),
然后:
20.2.1 模板参数的要求
2 通常情况下,不需要默认构造函数。某些容器类成员函数签名将默认构造函数指定为默认参数。如果使用默认参数调用了这些签名中的一个,则 T() 必须是一个定义良好的表达式 (8.5)。(8.3.6)
这里有两件事情需要注意: