为什么reverse_iterator有默认构造函数?

时间:2017-09-17 16:03:42

标签: c++ stl

我刚刚学习STL而reverse_iterator让我感到困惑。它有一个默认的构造函数,但我不明白如何使用它。 我试过了:

reverse_iterator<int*> r{};
r --;

程序崩溃了。我相信这种用法没有意义,它很容易导致崩溃,为什么允许使用默认构造函数?

2 个答案:

答案 0 :(得分:3)

std::reverse_iteratorbidirectional iterators,它们有明确要求它们是默认构造的。

至于why bidirectional iterators are default-constructible,主要是因为几乎可以肯定它们实现起来很简单,并且这样的保证使得算法更容易实现。

int* p = nullptr; *p;之类的东西本身就是UB,它违反了p可解除引用的前提条件,让适配器“采用”这些行为是相当自然的。

答案 1 :(得分:3)

cppreference上的文档说:

  

1)默认构造函数。 current是初始值。当且仅当值初始化Iterator上的相应操作也定义了行为时,对结果迭代器的操作才定义了行为。

有一些迭代器对于默认构造是有意义的;通常不是那些与容器直接相关的东西(我知道)。例如  一个istream迭代器:http://en.cppreference.com/w/cpp/iterator/istream_iterator/istream_iterator。但是,它不是双向的,所以你无法逆转它。

但是,原则上,您可以使用双向迭代器,并且其默认构造函数/值初始化程序至少定义了一些操作。对于这样的迭代器,您希望通过reverse_iterator反映行为。