Si. Los valores de los contenedores STL deben mantener la semántica de copia. IOW, deben comportarse como tipos primitivos (por ejemplo, int) lo que significa, entre otras cosas, que deben ser construibles por defecto.
Sin este (y otros requisitos), sería innecesariamente difícil implementar las diversas operaciones internas de copia / movimiento / intercambio / comparación 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 fue precisa. La construcción por defecto no es, de hecho, un requisito :
Desde 20.1.4.1:
El constructor predeterminado no es necesario. Ciertas firmas de funciones de miembros de clases de contenedores especifican el constructor predeterminado como argumento predeterminado. T () debe ser una expresión bien definida ...
Entonces, estrictamente hablando, su tipo de valor solo necesita ser construible predeterminado si está usando una función del contenedor que usa el constructor predeterminado en su firma.
Los requisitos reales (23.1.3) de todos los valores almacenados en contenedores STL son CopyConstructibley Assignable.
También existen otros requisitos específicos para contenedores particulares, como ser Comparable(por ejemplo, para las claves en un mapa).
Por cierto, lo siguiente se compila sin errores en comeau :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Entonces esto podría ser un problema de g ++.