Basato su ciò che è considerato idiomatico in C ++ 11:
- se un iteratore in un contenitore personalizzato sopravvive al fatto che il contenitore stesso viene distrutto?
- dovrebbe essere possibile rilevare quando un iteratore viene invalidato?
- sono le condizioni sopra condizionali su "build di debug" in pratica?
Dettagli : di recente mi sono occupato del mio C ++ e ho imparato a conoscere C ++ 11. Come parte di ciò, ho scritto un involucro idiomatico attorno alla libreria di uriparser . Parte di questo è il wrapping della rappresentazione della lista collegata dei componenti del percorso analizzati. Sto cercando consigli su ciò che è idiomatico per i contenitori.
Una cosa che mi preoccupa, arrivando più recentemente dai linguaggi raccolti dai rifiuti, è assicurare che gli oggetti casuali non spariscano agli utenti solo se commettono un errore in termini di vite. Per tenere conto di ciò, sia il contenitore PathList
che i suoi iteratori mantengono un shared_ptr
nell'oggetto stato interno effettivo. Questo garantisce che finché qualsiasi indichi che i dati esistono, così fanno i dati.
Tuttavia, guardando STL (e lotti di ricerca), non sembra che i contenitori C ++ lo garantiscano. Ho questo orribile sospetto che l'aspettativa è quella di lasciare che i contenitori vengano distrutti, invalidando ogni iteratore insieme ad esso. std::vector
sembra certamente consentire agli iteratori di essere invalidati e comunque (erroneamente) funzionare.
Quello che voglio sapere è: cosa ci si aspetta da un codice C ++ 11 "buono" / idiomatico? Dati i nuovi e brillanti puntatori intelligenti, sembra strano che STL ti consenta di saltare facilmente le gambe perdendo accidentalmente un iteratore. Sta usando shared_ptr
ai dati di supporto un'inefficienza inutile, una buona idea per il debug o qualcosa che ci si aspetta che STL non funzioni?
(Spero che questo approccio a "C ++ 11 idiomatico" eviti le accuse di soggettività ...)