我剛剛學習STL和reverse_iterator
讓我感到困惑。它有一個默認的構造函數,但我不明白如何使用它。 我試過了:爲什麼reverse_iterator有一個默認的構造函數?
reverse_iterator<int*> r{};
r --;
和程序崩潰了。我相信這種用法沒有意義,它很容易導致崩潰,爲什麼允許使用默認的構造函數?
我剛剛學習STL和reverse_iterator
讓我感到困惑。它有一個默認的構造函數,但我不明白如何使用它。 我試過了:爲什麼reverse_iterator有一個默認的構造函數?
reverse_iterator<int*> r{};
r --;
和程序崩潰了。我相信這種用法沒有意義,它很容易導致崩潰,爲什麼允許使用默認的構造函數?
std::reverse_iterator
是bidirectional iterators,它們有一個明確的要求,即它們是默認構造的。
對於why bidirectional iterators are default-constructible,主要是因爲它幾乎可以確定它們實現起來微不足道,給出這樣的保證使得算法更容易實現。
書寫像int* p = nullptr; *p;
這樣的東西本身就是UB,它違反了前提條件,即讓適配器「採用」這種行爲是非常自然的。
上cppreference文檔說:
1)默認的構造。電流被初始化。當且僅當對值初始化的迭代器的相應操作也具有定義的行爲時,生成的迭代器上的操作具有已定義的行爲。
有一些迭代器是有意義的默認構造;通常不是那些與容器直接相關的東西(我知道)。例如 istream迭代器:http://en.cppreference.com/w/cpp/iterator/istream_iterator/istream_iterator。但是,它不是雙向的,所以你不能扭轉它。
但是,原則上,您可以有一個雙向迭代器,並且其默認構造函數/值初始值設定項至少具有一些定義的操作。對於這樣的迭代器,您希望通過reverse_iterator
反映行爲。
也許只是爲了支持聲明「未初始化」的迭代器以後被分配一個特定的值。只要將默認構造的迭代器視爲未初始化的變量,即在您分配一個有意義的值之前不要對它們執行任何操作。 – AnT
爲什麼你可以定義一個指向'nullptr'的指針然後解引用它?有很多事情是非常不安全的,甚至是不確定的。這就是C++的速度和它自己在腳下的地位。 –
@RickAstley我相信C++標準庫已經從「隨意拍腳」的心態轉移到「如果不花錢就不會打你的腳」。如果有不安全的地方,就不得不有更多的理由 –