2013-09-21 61 views
1

有時我需要將矢量迭代器轉換爲指針。我知道有幾種方法可以做到這一點,比如vector::data,但我很好奇&(*some_vector.end())的有效性。我知道解引用矢量的末尾是未定義的行爲,但似乎&運算符不需要表達式的值,因此結束迭代器在這個表達式中不會被實際解引用。那是對的嗎?或者這仍然是未定義的行爲?表達式'&(* some_vector.end())`是否定義良好?

+1

'* some_vector.end()'仍然試圖取消引用結束() – billz

回答

3

嘗試data()+end()-begin()

雖然vector迭代器可以實現爲原始指針,但它們不一定是。如果迭代器是迭代器,則取消引用迭代器是未定義的,這意味着在實踐中可以在調試中檢測迭代器以檢測該情況,並且編譯器可以合法地假定您從不這樣做。所以聲明&*it-&*begin() >= size()可以按照標準合法地被視爲false。儘管這可能很有趣,但是GCC使用簽名溢出做類似的優化,其中硬件做了一件事,但編譯器假定沒有發生任何未定義的事情,並且它可以放棄嘗試檢測溢出的整個代碼分支。

+0

這是有道理的。 –

1

取消引用迭代器的先決條件是它不同於結束迭代器。即使你對結果所做的一切都是爲了接受它的地址,它仍然是未定義的行爲。