2017-09-17 79 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反映行爲。

相關問題