A exclusão de std :: list :: iterator invalida o iterador e destrói o objet

Por que o seguinte imprime2?

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;

Eu sei o queerase retorna, mas eu me pergunto por que isso está OK? Ou é indefinido ou depende do compilador?