2017-09-17 80 views
5

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

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

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

+2

也许只是为了支持声明“未初始化”的迭代器以后被分配一个特定的值。只要将默认构造的迭代器视为未初始化的变量,即在您分配一个有意义的值之前不要对它们执行任何操作。 – AnT

+0

为什么你可以定义一个指向'nullptr'的指针然后解引用它?有很多事情是非常不安全的,甚至是不确定的。这就是C++的速度和它自己在脚下的地位。 –

+0

@RickAstley我相信C++标准库已经从“随意拍脚”的心态转移到“如果不花钱就不会打你的脚”。如果有不安全的地方,就不得不有更多的理由 –

回答

3

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

对于why bidirectional iterators are default-constructible,主要是因为它几乎可以确定它们实现起来微不足道,给出这样的保证使得算法更容易实现。

书写像int* p = nullptr; *p;这样的东西本身就是UB,它违反了前提条件,即让适配器“采用”这种行为是非常自然的。

3

cppreference文档说:

1)默认的构造。电流被初始化。当且仅当对值初始化的迭代器的相应操作也具有定义的行为时,生成的迭代器上的操作具有已定义的行为。

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

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

相关问题