有時我需要將矢量迭代器轉換爲指針。我知道有幾種方法可以做到這一點,比如vector::data
,但我很好奇&(*some_vector.end())
的有效性。我知道解引用矢量的末尾是未定義的行爲,但似乎&
運算符不需要表達式的值,因此結束迭代器在這個表達式中不會被實際解引用。那是對的嗎?或者這仍然是未定義的行爲?表達式'&(* some_vector.end())`是否定義良好?
1
A
回答
3
嘗試data()+end()-begin()
。
雖然vector
迭代器可以實現爲原始指針,但它們不一定是。如果迭代器是迭代器,則取消引用迭代器是未定義的,這意味着在實踐中可以在調試中檢測迭代器以檢測該情況,並且編譯器可以合法地假定您從不這樣做。所以聲明&*it-&*begin() >= size()
可以按照標準合法地被視爲false
。儘管這可能很有趣,但是GCC使用簽名溢出做類似的優化,其中硬件做了一件事,但編譯器假定沒有發生任何未定義的事情,並且它可以放棄嘗試檢測溢出的整個代碼分支。
+0
這是有道理的。 –
1
取消引用迭代器的先決條件是它不同於結束迭代器。即使你對結果所做的一切都是爲了接受它的地址,它仍然是未定義的行爲。
相關問題
- 1. std :: byte是否定義良好?
- 2. 這段代碼是否定義良好?
- 3. 根據C99標準,下面的代碼是否定義良好?
- 4. 非終止constexpr函數是否定義良好?
- 5. 此代碼行爲是否定義良好?
- 6. 良好的正則表達式確定強,中,弱口令
- 7. 這個C語句的順序是否定義良好?
- 8. NRVO - 這個程序的輸出是否定義良好?
- 9. 在jQuery中表現良好是否意味着在JavaScript中表現良好?
- 10. S表達式的良好形式/模式
- 11. 下面的表達式的行爲是否被很好地定義?
- 12. 否定表達式
- 13. 否定表達式
- 14. for循環中未定義的行爲 - 不應該使用表達式分隔使其定義良好?
- 15. 爲了與良好的表達XML
- 16. C - Is * x ++ = * y ++定義良好?
- 17. 這個表達式是否調用未定義的行爲?
- 18. 良好的正則表達式消毒輸入
- 19. iOS的正則表達式有良好的文字
- 20. 內聯運營商是否良好?
- 21. 定義PHP類時的良好做法
- 22. 良好的自定義查看教程
- 23. 否定正則表達式
- 24. C#否定表達式
- 25. 否定正則表達式
- 26. 正則表達式否定
- 27. 表達式springMacroRequestContext未定義
- 28. 定義正則表達式
- 29. 在自定義表達式
- 30. 是否在腳本良好實踐中未定義全局變量?
'* some_vector.end()'仍然試圖取消引用結束() – billz