Иногда мне нужно преобразовать векторные итераторы в указатели. Я знаю, что есть несколько способов сделать это, например, vector::data
, но мне интересно узнать о действии &(*some_vector.end())
. Я знаю разыменование конца вектора - это неопределенное поведение, но кажется, что оператору &
не нужно значение выражения, и, следовательно, конечный итератор не будет разыменован в этом выражении. Это верно? Или это еще неопределенное поведение?Является ли выражение `& (* some_vector.end())« корректным »?
ответ
Пробег: data()+end()-begin()
.
В то время как итераторы vector
могут быть реализованы как необработанные указатели, они не обязательно должны быть. Разделение итератора не определено, если это итератор end
, что на практике означает, что итераторы могут быть отладки, чтобы обнаружить этот случай, и компилятор может на законных основания предположить, что вы этого никогда не делаете. Таким образом, заявление &*it-&*begin() >= size()
может легально, по стандарту, рассматриваться как false
.
Хотя это может быть смешно, GCC делает аналогичные оптимизации с подписанным переполнением, где аппаратное обеспечение делает одно, но компилятор не предполагает, что ничего неопределенного не происходит, и он может отбрасывать целые ветви кода, которые пытаются обнаружить переполнение.
Это имеет смысл. –
Предпосылкой разыменования итератора является то, что он отличается от конечного итератора. Даже если все, что вы делаете с результатом, это принять его адрес, это все еще неопределенное поведение.
- 1. Является ли этот код корректным?
- 2. Манифест не является корректным
- 3. Является ли `free (a_comparable_pointer)` корректным или UB?
- 4. Является ли отрицательный индекс для оператора [] корректным?
- 5. Является ли метод Java ArrayList.clear() корректным?
- 6. Является ли это поведение сравнения корректным?
- 7. Является ли преобразование указателя корректным указателем пустоты?
- 8. разрешение экрана monogame является корректным
- 9. Mapbox setCameraPosition не является корректным.
- 10. Является корректным XML также допустимым HTML
- 11. Является ли он корректным для сравнения с инициализируемым значением итератором?
- 12. Является ли `(T *) 0 - (T *) 0` корректным для 0?
- 13. Является ли шаблон абстрактной фабрики корректным для данного сценария ....?
- 14. Является ли порядок этой инструкции С корректным определением?
- 15. Чтение из файла с fopen: является ли char ** корректным?
- 16. Является ли `entrycget` корректным возвратом данных из-за повторяющихся записей?
- 17. Является ли следующий массив корректным для двоичного поиска?
- 18. Является ли поведение корректным, когда `sleep_until()` указывает время в прошлом?
- 19. Конфигурационный файл не является корректным XML # 2
- 20. Тэг `A` не является корректным, но почему?
- 21. Ссылка не является корректным визуальным DependencyObject
- 22. IIS - Конфигурационный файл не является корректным XML
- 23. asp.net .exe не является корректным приложением win32
- 24. Указанное имя не является корректным именем пользователя
- 25. PHP, добавляющий список значений, не является корректным
- 26. Проверьте, является ли выражение функцией?
- 27. Является `x--> 0 && array [x]` корректным поведением в C++?
- 28. Python SAX-анализатор говорит, что XML-файл не является корректным.
- 29. Как разобрать XML-файл, который не является корректным
- 30. python behave генерирует XML, который является «не корректным»
'* some_vector.end()' все еще пытается разыменовать конец() – billz