Le message d'erreur indique clairement que le constructeur par défaut a été supprimé implicitement . Il dit même pourquoi: la classe contient une variable const non statique, qui ne serait pas initialisée par le ctor par défaut.
class X {
const int x;
};
Depuis X::x
est const
, il doit être initialisé - mais cteur par défaut n'initialise pas normalement (car il est un type POD). Par conséquent, pour obtenir un cteur par défaut, vous devez en définir un vous-même (et il doit s'initialiser x
). Vous pouvez avoir le même genre de situation avec un membre qui est une référence:
class X {
whatever &x;
};
Il est probablement intéressant de noter que ces deux éléments désactiveront également la création implicite d'un opérateur d'affectation, pour essentiellement la même raison. L'opérateur d'affectation implicite effectue normalement une affectation par membre, mais avec un membre const ou un membre de référence, il ne peut pas le faire car le membre ne peut pas être affecté. Pour que l'affectation fonctionne, vous devez écrire votre propre opérateur d'affectation.
C'est pourquoi un const
membre doit généralement être statique - lorsque vous effectuez une affectation, vous ne pouvez pas attribuer le membre const de toute façon. Dans un cas typique, toutes vos instances auront la même valeur, donc elles pourraient aussi bien partager l'accès à une seule variable au lieu d'avoir de nombreuses copies d'une variable qui auront toutes la même valeur.
Il est bien sûr possible de créer des instances avec des valeurs différentes - vous (par exemple) transmettez une valeur lorsque vous créez l'objet, donc deux objets différents peuvent avoir deux valeurs différentes. Si, cependant, vous essayez de faire quelque chose comme les permuter, le membre const conservera sa valeur d'origine au lieu d'être permuté.