A mensagem de erro diz claramente que o construtor padrão foi excluído implicitamente . Ele até diz o porquê: a classe contém uma variável const não estática, que não seria inicializada pelo ctor padrão.
class X {
const int x;
};
Desde X::x
é const
, ele deve ser inicializado - mas um ctor padrão normalmente não inicializá-lo (porque é um tipo POD). Portanto, para obter um ctor padrão, você precisa definir um (e ele deve inicializar x
). Você pode ter o mesmo tipo de situação com um membro que é uma referência:
class X {
whatever &x;
};
Provavelmente, vale a pena notar que ambos também desabilitarão a criação implícita de um operador de atribuição, essencialmente pelo mesmo motivo. O operador de atribuição implícita normalmente faz a atribuição de membros, mas com um membro const ou membro de referência, ele não pode fazer isso porque o membro não pode ser atribuído. Para fazer a atribuição funcionar, você precisa escrever seu próprio operador de atribuição.
É por isso que um const
membro normalmente deve ser estático - quando você faz uma atribuição, você não pode atribuir o membro const de qualquer maneira. Em um caso típico, todas as suas instâncias terão o mesmo valor, então elas também podem compartilhar o acesso a uma única variável em vez de ter muitas cópias de uma variável que terá o mesmo valor.
É possível, claro, criar instâncias com valores diferentes - você (por exemplo) passa um valor ao criar o objeto, então dois objetos diferentes podem ter dois valores diferentes. Se, entretanto, você tentar fazer algo como trocá-los, o membro const manterá seu valor original em vez de ser trocado.