C 11 Initialisation globale pour les classes avec initialiseurs de membres
C 11 introduit l'initialisation globale à l'aide d'accolades pour les classes, permettant de spécifier des initialiseurs pour tous les membres de données non statiques. Cependant, la norme en C 11 soulève la question : des initialiseurs de membres en classe peuvent-ils exister au sein de structures agrégées ?
En C 11, avoir des initialiseurs de membres dans une classe rend la structure ou la classe non agrégée. Cette restriction découle de la conviction que les initialiseurs de membres en classe partagent des similitudes avec les constructeurs définis par l'utilisateur. Cependant, l'ajout d'initialiseurs de membres ne devrait pas automatiquement disqualifier une classe d'être un agrégat.
La norme C 14 résout ce problème en modifiant la définition des classes d'agrégat pour exclure uniquement les constructeurs fournis par l'utilisateur, privés ou protégés non statiques. les données membres, les classes de base et les fonctions virtuelles. L'inclusion des initialiseurs de membres comme disqualificatif a été supprimée.
Par conséquent, en C 14, une classe comme celle-ci est désormais considérée comme un agrégat :
struct A { int a = 3; int b = 3; }; A a{0, 1};
En C 11, ce qui précède le code aurait été invalide car A n’est pas un agrégat. Cependant, en C 14, le code est valide et l'objet a sera initialisé avec a = 0 et b = 1.
Les versions récentes de g (5.0 et supérieures) prennent désormais en charge la définition des agrégats de C 14 avec initialiseurs de membres non statiques. Par conséquent, l'exemple de code sera compilé en g avec -std=c 14 ou -std=c 1y.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!