Según lo que se considera idiomático en C ++ 11:
- ¿Debería un iterador en un contenedor personalizado sobrevivir al contenedor en sí mismo siendo destruido?
- ¿Debería ser posible detectar cuando un iterador se invalida?
- ¿están condicionados los anteriores a las "compilaciones de depuración" en la práctica?
Detalles : Recientemente he estado repasando mi C ++ y aprendiendo a usar C ++ 11. Como parte de eso, he estado escribiendo un contenedor idiomático alrededor de la biblioteca de uriparser . Parte de esto es envolver la representación de la lista vinculada de componentes de ruta analizados. Estoy buscando consejos sobre lo que es idiomático para los contenedores.
Una cosa que me preocupa, proveniente más recientemente de los lenguajes recolectados de basura, es asegurar que los objetos aleatorios no desaparezcan de los usuarios si cometen un error con respecto a las vidas. Para tener en cuenta esto, tanto el PathList
contenedor como sus iteradores mantienen un shared_ptr
objeto de estado interno real. Esto garantiza que, mientras exista algo que apunte a esos datos, también existirán los datos.
Sin embargo, al mirar el STL (y mucha búsqueda), no parece que los contenedores C ++ lo garanticen. Tengo esta horrible sospecha de que la expectativa es simplemente dejar que se destruyan los contenedores, invalidando cualquier iterador junto con él. std::vector
ciertamente parece permitir que los iteradores se invaliden y aún funcionen (incorrectamente).
Lo que quiero saber es: ¿qué se espera del código "bueno" / idiomático de C ++ 11? Teniendo en cuenta los nuevos y brillantes punteros inteligentes, parece extraño que STL le permita volar fácilmente las piernas al perder accidentalmente un iterador. ¿Utilizar shared_ptr
los datos de respaldo es una ineficiencia innecesaria, una buena idea para la depuración o algo que se espera que STL simplemente no haga?
(Espero que conectar esto a "C ++ 11 idiomático" evite las cargas de subjetividad ...)