Il messaggio di errore dice chiaramente che il costruttore predefinito è stato eliminato implicitamente . Dice anche perché: la classe contiene una variabile const non statica, che non verrebbe inizializzata dal ctor predefinito.
class X {
const int x;
};
Poiché X::x
è const
, deve essere inizializzato, ma un ctor predefinito normalmente non lo inizializzerebbe (perché è un tipo POD). Pertanto, per ottenere un ctor predefinito, è necessario definirne uno da soli (e deve essere inizializzato x
). Puoi ottenere lo stesso tipo di situazione con un membro che è un riferimento:
class X {
whatever &x;
};
Probabilmente vale la pena notare che entrambi disabiliteranno anche la creazione implicita di un operatore di assegnazione, essenzialmente per lo stesso motivo. L'operatore di assegnazione implicita normalmente esegue l'assegnazione in base ai membri, ma con un membro const o un membro di riferimento non può farlo perché il membro non può essere assegnato. Per far funzionare l'assegnazione, è necessario scrivere il proprio operatore di assegnazione.
Questo è il motivo per cui un const
membro dovrebbe in genere essere statico: quando si esegue un compito, non è comunque possibile assegnare il membro const. In un caso tipico tutte le tue istanze avranno lo stesso valore, quindi potrebbero anche condividere l'accesso a una singola variabile invece di avere molte copie di una variabile che avranno tutte lo stesso valore.
È possibile, ovviamente, creare istanze con valori diversi: tu (ad esempio) passi un valore quando crei l'oggetto, quindi due oggetti diversi possono avere due valori diversi. Se, tuttavia, provi a fare qualcosa come scambiarli, il membro const manterrà il suo valore originale invece di essere scambiato.