La raison en est que si la classe n'est pas définie par l'utilisateur et le constructeur, alors il peut être POD, et la GOUSSE de classe n'est pas initialisé par défaut. Donc, si vous déclarez une const objet de POD qui est non initialisée, à quoi ça sert? Je pense donc que la Norme impose cette règle afin que l'objet peut effectivement être utile.
struct POD
{
int i;
};
POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!
POD p2 = POD(); //initialized
const POD p3 = POD(); //initialized
const POD p4; //uninitialized - error - as we cannot change it later on!
Mais si vous faites de la classe non-POD:
struct nonPOD_A
{
nonPOD_A() {} //this makes non-POD
};
nonPOD_A a1; //initialized
const nonPOD_A a2; //initialized
Notez la différence entre le POD et non-POD.
Défini par l'utilisateur constructeur est une manière de faire de la classe non-POD. Il ya plusieurs façons que vous pouvez faire.
struct nonPOD_B
{
virtual void f() {} //virtual function make it non-POD
};
nonPOD_B b1; //initialized
const nonPOD_B b2; //initialized
Avis nonPOD_B n'est pas défini par l'utilisateur défini constructeur. Compiler. Compiler:
Et le commentaire de la fonction virtuelle, puis il donne une erreur, comme prévu:
Eh bien, je pense que vous avez mal compris le passage. Il est le premier à dire cela (§8.5/9):
Si aucun initialiseur est spécifié pour un objet, et l'objet est de (éventuellement cv qualifiés) non-POD classe type (ou un tableau de celui-ci), l'objet doit être par défaut-initialisé; [...]
Il parle de la non-POD classe , éventuellement de cv qualifiés de type. Qui est, le non-POD objet doit être par défaut-initialisé, si il n'y a pas d'initialiseur spécifié. Et qu'est-ce que par défaut-initialisé? Pour les non-POD, la spec dit (§8.5/5),
À défaut d'initialisation d'un objet de type T signifie:
- si T est un non-POD type de classe (article 9), le constructeur par défaut pour T est appelé (et l'initialisation est mal formé, si T n'a pas de accessible le constructeur par défaut);
Simplement, il parle de constructeur par défaut de T, si ses définies par l'utilisateur ou généré par le compilateur est pas pertinent.
Si vous êtes clair jusqu'à présent, puis de comprendre ce que la spécification suivante est dit ((§8.5/9),
[...]; si l'objet est de const qualifiés de type, le type de classe doit avoir un utilisateur déclaré dans le constructeur par défaut.
Donc, ce texte l'indique, le programme va être mal formé , si l'objet est de const qualifiés de type POD, et il n'y a pas d'initialiseur spécifié (parce que les GOUSSES ne sont pas initialisé par défaut):
POD p1; //uninitialized - can be useful - hence allowed
const POD p2; //uninitialized - never useful - hence not allowed - error
En passant, cette compile amende, en raison de sa non-POD, et peut être par défaut-initialisé.