Un iteratore non è solo un riferimento ai dati. Deve sapere come incrementare, ecc.
Per supportare l'accesso casuale, le implementazioni avranno una serie dinamica di puntatori ai blocchi. L'iteratore deque punterà in questo array dinamico. Quando il deque cresce, potrebbe essere necessario assegnare un nuovo chunk. La matrice dinamica crescerà, invalidando i suoi iteratori e, di conseguenza, gli iteratori della deque.
Quindi non è che i blocchi vengono riallocati, ma l'array di puntatori a questi blocchi può essere. Infatti, come ha notato Johannes Schaub, i riferimenti non sono invalidati.
Si noti inoltre che le garanzie di iteratore della deque non sono inferiori a quelle del vettore, che vengono invalidate anche quando il contenitore cresce.
iirc, l'implementazione di deque di gcc mantiene una serie di puntatori a questi blocchi ... Se l'array deve essere riallocato, gli iteratori potrebbero diventare non validi. Forse è questa la ragione? Non sono sicuro ... Questo almeno spiega perché gli inserimenti su entrambi i lati invalidano gli iteratori, ma non i riferimenti/i puntatori agli elementi. –