po pierwsze: cokolwiek ponizej w moim poscie przeczytasz, jest podyktowane "dokładnością" opisów, tekstów, definicji i itp. Osobiście jestem przekonany, że Twoja std::list gwarantuje Ci niezmienność adresów elementów tak długo, jak element siedzi na liscie.
Jedną z gwarancji jaką dostajesz, w przeciwienstwie np. do vector'a, jest to, że jeśli kiedykolwiek do jakiekogolkwiek elementu listy pobierzesz 'iterator', to nie wazne co bedziesz robil na liscie, dopoki element wskazywany przez iterator dalej bedzie logicznie -na- liscie, to ten iterator bedzie ważny . Niestety, wazne jest sformulowanie, iterator.
Z iteratora mozesz wyciagnac wskaznik na element - &*iterator - i to w zasadzie powinno Ci wystarczyc.
Niestety nie przypominam sobie, aby stl::list gwarantowało niezmiennosc adresu elementow. Wydaje mi sie, ze jedyne gwarancje tyczyly sie operacji dokonywanych na elementach poprzez iteratory. Jednak rowniez wydaje mi sie ze by bylo niezwykle dziwne gdyby wewnetrzny kontener listy przealokowywal lub przenosil elementy w momencie wstawiania/usuwania. Nie taki jest "interfejs" listy. Lista ma gwarantowac pewne konkrene, "listowe", złożoności obliczeniowe metod insert/fetch/delete, czego przy przenoszeniu/przealokowywaniu elementow w tych momentach po prostu by sie nie dalo uzyskac..
http://www.cplusplus.com/reference/stl/list/ 1)
http://www.cppreference.com/wiki/container/list/start 2)
http://www.sgi.com/tech/stl/List.html 3)
- erase: "and, unlike in these, all of the previously obtained iterators and references remain valid after the erasing operation and refer to the same elements they were referring before (except, naturally, for those referring to erased elements)." -- dopisek and references sugeruje ze wskazniki i referencje rowniez pozostaja wazne!
- erase: "No iterators, except to the removed elements, are invalidated." -- ani mrumru o wskanzikach/referencjach
- "[3] A similar property holds for all versions of insert() and erase(). List<T, Alloc>::insert() never invalidates any iterators, and list<T, Alloc>::erase() only invalidates iterators pointing to the elements that are actually being erased."
Tak wiec, poza pierwszym źródłem, które jest dobre, ale nie jest "znaczące", cała reszta mówi o iteratorach, czyli fakty czy adres elementu pozostanie taki sam, wyglada na, niestety, implementation-specific. To znaczy, ze jesli jakas implementacja listy bedzie miala hiperinteligentne iteratory ktore na biezaco dynamicznie wyliczaja wskazniki, to sama lista moglaby przenosic elementy, i takie zachowanie pozostaloby w zgodzie ze specyfikacja.. Nie mniej, i tak sadze, ze jest to bardzo malo prawdopodobne, zwyczajowo przyjmuje sie ze pointer/referecja na element zyje tak dlugo jak zwiazany z nia iterator jest ważny..
Przekopie sie jeszcze przez kilka dokumnetow, moze cos znajde wiecej.