我刚刚学习STL而reverse_iterator
让我感到困惑。它有一个默认的构造函数,但我不明白如何使用它。
我试过了:
reverse_iterator<int*> r{};
r --;
程序崩溃了。我相信这种用法没有意义,它很容易导致崩溃,为什么允许使用默认构造函数?
答案 0 :(得分:3)
std::reverse_iterator
是bidirectional 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
反映行为。