Los requisitos del contenedor han cambiado de C ++ 03 a C ++ 11. Mientras que C ++ 03 tenía requisitos generales (p. Ej., Copia de construcción y asignabilidad para vector), C ++ 11 define requisitos detallados en cada operación de contenedor (sección 23.2).
Como resultado, puede, por ejemplo, almacenar un tipo que es copia-construible pero no asignable, como una estructura con un miembro constante, en un vector siempre que solo realice ciertas operaciones que no requieren asignación (construcción y push_back
son tales operaciones ; insert
no es).
Lo que me pregunto es: ¿significa esto que el estándar ahora lo permite vector<const T>
? No veo ninguna razón por la que no debería const T
, al igual que una estructura con un miembro constante, es un tipo que es copia construible pero no asignable, pero puede que me haya perdido algo.
(Parte de lo que me hace pensar que me he perdido algo es que el tronco gcc se bloquea y se quema si intenta crear una instancia vector<const T>
, pero está bien vector<T>
si T tiene un miembro constante).
address
funciones miembro sobrecargadas en el asignador predeterminado: cuando T es constante, estas dos sobrecargas tienen la misma firma. Una forma fácil de corregir esto sería especializarsestd::allocator<const T>
y eliminar una de las sobrecargas.push_back
. Pero si el diseño no lo permite, es mejor que no lo hagamos. Solo tenía curiosidad.std::vector<const T>
exactamente porque es muy similar aconst std::vector<T>
, pero sin las implicaciones negativas de este último para la clase que lo tiene. De hecho,std::vector<const T>
es EXACTAMENTE lo que necesito semánticamente en la mayoría de los casos en los que usovector
. Ahora tengo que dejarloconst
, junto con la fiabilidad que proporciona.