Подтвердить что ты не робот

Is & * vector:: end() undefined поведение?

Я думал, что &*vector::end() было undefined поведение... пока я не увидел некоторую должность, ссылаясь на Код Stroustrup:

void vector_pointer_test(element_t* first, element_t* last, int number_of_times) 
{ 
       vector<element_t> container(first, last); 
       // &*container.begin() gets us a pointer to the first element 
       sort(&*container.begin(), &*container.end()); 
       unique(&*container.begin(), &*container.end()); 
}

Вызывает разыменование поведения iterator undefined или допустимо?

4b9b3361

Ответ 1

Это поведение undefined. То есть поведение, не определенное стандартом С++. Это может быть определено реализацией. Скорее всего, это произойдет случайно в некоторых ситуациях, а не в других.

В этом случае, если итератор является необработанным указателем, компилятор, скорее всего, оптимизирует & * я в no-op, поэтому он, скорее всего, будет работать. Страуструп, возможно, знал, что его вектор использовал исходные указатели как итераторы.

Даже если компилятор не оптимизирует его, на практике он может только сбой, если векторная память будет выделена для завершения на границе сегмента. (Или, если реализация итератора написана для проверки того, что она не является различимой, например, для целей отладки.)

В С++ 11 это должно быть написано как:

sort(container.data(), container.data()+container.size()); 

Ответ 2

Это не обязательно поведение undefined, но зависит от конкретной реализации итератора:

С++ 03 24.1/5 Требования к итератору

Так же, как обычный указатель на массив гарантирует, что существует значение указателя, указывающее последний элемент массива, поэтому для любого Тип итератора есть значение итератора, которое указывает прошлое элемент соответствующего контейнера. Эти значения называются прошлые значения. Значения итератора i, для которого выражение * я определяется как разыменованный. В библиотеке никогда не предполагается, что значения в конце концов являются разыскаемыми.

Этот код имеет поведение undefined, если container.end() не является разыменованным. Много раз векторный итератор будет просто указателем - в тех случаях нет поведения undefined.