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 CopyConstructible
e 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 ++.