ВНИМАНИЕ: Это вопрос не о валидности самого итератора!
Привет Лор,
Функция итератора operator->() возвращает указатель. Будет ли валидным этот указатель после каких-то неконстантных действий с итератором? Ну, то есть, если итератор при разыменовывании просто возвращает указатель непосредственно на сам элемент контейнера, то всё понятно. А может ли он делать какие-то другие хитрые действия и возвращать указатель на какой-нибудь временный объект?
Вот 2 примера, которые показывают, что всё вроде бы работает (по крайней мере, с std::vector). Но можно ли на это полагаться с произвольным итератором, не является ли это UB? Более важно, если я делаю свой итератор, обязан ли я обеспечивать подобную работу?
#include <iostream>
#include <vector>
int main(void)
{
std::vector<int> x;
x.push_back(1); //first element
x.push_back(2); //second element
std::vector<int>::iterator i(x.begin()); // declare an iterator pointing to the first element (0)
int * xptr=i.operator->(); // dereference the iterator and save the pointer
++i; // increment the iterator
std::cout<<*xptr<<'\n'; // get dereferenced value
return 0;
}
#include <iostream>
#include <vector>
int main(void)
{
std::vector<int> x;
x.push_back(1); //first element
x.push_back(2); //second element
std::vector<int>::iterator *iptr=new std::vector<int>::iterator(x.begin()); // declare an iterator pointing to the first element (0)
int * xptr=iptr->operator->(); // dereference the iterator and save the pointer
delete iptr; //delete the iterator
std::cout<<*xptr<<'\n'; // get dereferenced value
return 0;
}