¿No borra std :: list :: iterator invalida el iterador y destruye el objeto?

¿Por qué imprime lo siguiente2?

list<int> l;
l.push_back( 1 );
l.push_back( 2 );
l.push_back( 3 );
list<int>::iterator i = l.begin();
i++;
l.erase( i );
cout << *i;

Yo se queerase regresa, pero me pregunto por qué esto está bien. ¿O no está definido o depende del compilador?