El mensaje de error dice claramente que el constructor predeterminado se ha eliminado implícitamente . Incluso dice por qué: la clase contiene una variable constante, no estática, que no sería inicializada por el ctor predeterminado.
class X {
const int x;
};
Como X::x
es const
, debe inicializarse, pero un ctor predeterminado normalmente no lo inicializaría (porque es un tipo POD). Por lo tanto, para obtener un ctor predeterminado, debe definir uno usted mismo (y debe inicializarse x
). Puede tener el mismo tipo de situación con un miembro que es una referencia:
class X {
whatever &x;
};
Probablemente valga la pena señalar que ambos también deshabilitarán la creación implícita de un operador de asignación, esencialmente por la misma razón. El operador de asignación implícita normalmente realiza asignaciones por miembros, pero con un miembro constante o un miembro de referencia, no puede hacerlo porque el miembro no se puede asignar. Para que la asignación funcione, debe escribir su propio operador de asignación.
Esta es la razón por la que un const
miembro normalmente debe ser estático: cuando haces una asignación, no puedes asignar el miembro constante de todos modos. En un caso típico, todas sus instancias tendrán el mismo valor, por lo que también podrían compartir el acceso a una sola variable en lugar de tener muchas copias de una variable que tendrán el mismo valor.
Sin embargo, es posible, por supuesto, crear instancias con valores diferentes: usted (por ejemplo) pasa un valor cuando crea el objeto, por lo que dos objetos diferentes pueden tener dos valores diferentes. Sin embargo, si intenta hacer algo como intercambiarlos, el miembro const conservará su valor original en lugar de intercambiarse.