Sim. Os valores em contêineres STL precisam manter a semântica de cópia. IOW, eles precisam se comportar como tipos primitivos (por exemplo, int) o que significa, entre outras coisas, eles devem ser construtíveis por padrão.
Sem isso (e outros requisitos), seria desnecessariamente difícil implementar as várias operações internas de copiar / mover / trocar / comparar nas estruturas de dados com as quais os contêineres STL são implementados.
Após referência ao padrão C ++, vejo que minha resposta não foi precisa. A construção padrão não é, de fato, um requisito :
De 20.1.4.1:
O construtor padrão não é necessário. Certas assinaturas de função de membro de classe de contêiner especificam o construtor padrão como um argumento padrão. T () deve ser uma expressão bem definida ...
Então, estritamente falando, seu tipo de valor só precisa ser construtível padrão se você estiver usando uma função do contêiner que usa o construtor padrão em sua assinatura.
Os requisitos reais (23.1.3) de todos os valores armazenados em contêineres STL são CopyConstructiblee Assignable.
Existem também outros requisitos específicos para contêineres específicos, como ser Comparable(por exemplo, para chaves em um mapa).
A propósito, o seguinte é compilado sem erros no comeau :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Portanto, este pode ser um problema do g ++.