Sí. Los valores en los contenedores STL necesitan mantener la semántica de copia. IOW, necesitan comportarse como tipos primitivos (por ejemplo, int) lo que significa, entre otras cosas, que deben ser predecibles.
Sin esto (y otros requisitos) sería innecesariamente difícil implementar las diversas operaciones internas de copiar/mover/intercambiar/comparar en las estructuras de datos con las que se implementan los contenedores STL.
Al hacer referencia al Estándar C++, veo que mi respuesta no era precisa. predeterminado-construcción es, de hecho, no es un requisito:
De 20.1.4.1:
The default constructor is not required. Certain container class member function signatures specify the default constructor as a default argument. T() must be a well-defined expression ...
Por lo tanto, en sentido estricto, el tipo de valor sólo tiene que ser construible por defecto si se esté utilizando una función del contenedor que utiliza el constructor predeterminado en su firma.
Los requisitos reales (23.1.3) de todos los valores almacenados en contenedores STL son CopyConstructible
y Assignable
.
También existen otros requisitos específicos para contenedores particulares, como Comparable
(por ejemplo, para las claves de un mapa).
Por cierto, el siguiente compila sin error en comeau:
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
lo que este podría ser un g ++ problema.
El código anterior compila muy bien en MinGW (g ++ 3.4.5) y MSVC++ 2008, siempre que se proporcione un typedef para MyType y un punto y coma agregado al final de la clase. Debe estar haciendo otra cosa (por ejemplo, llamar al operador [] según lo mencionado por bb); publique el código * completo *. –
Ah, sí, tienes razón. Hará. –
Sí, sin el uso de myMap no sabes qué se debe compilar para la clase de mapa. ¿Qué proveedor de la biblioteca stl y la versión también podría ayudar. –