Initialisation d'agrégat C 11 pour les classes avec initialiseurs de membres non statiques
En C 11, une classe ou une structure est considérée comme un agrégat si elle répond à des critères spécifiques, notamment l'absence de constructeurs définis par l'utilisateur, d'initialiseurs accolade ou égale pour les données membres non statiques et d'absence de données membres non statiques privées ou protégées.
Cependant, dans la norme C 11, l'ajout d'initialiseurs de membres non statiques à une classe ou à une structure modifie son statut en tant qu'agrégat. En effet, les initialiseurs de membres sont similaires aux constructeurs définis par l'utilisateur, ce qui empêche la classe ou la structure d'être un agrégat. Ce changement de définition peut conduire à un comportement inattendu.
Dans l'exemple fourni :
struct A { int a = 3; int b = 3; }; A a{0,1}; // ???
La classe A n'est plus considérée comme un agrégat en raison de la présence d'initialiseurs de membres dans la classe. En conséquence, l'initialisation globale A a{0,1} ; n'est pas valide.
Ce comportement a été révisé dans C 14, où la présence d'initialiseurs de membres non statiques n'empêche plus une classe ou une structure d'être un agrégat. Ainsi, en C 14, l'initialisation globale de A est valide.
Il est important de noter que le standard C a subi des modifications, et il est indispensable de vérifier les dernières versions du standard ou d'utiliser un C conforme 14 ou version ultérieure pour garantir une interprétation correcte du code impliquant une initialisation globale et des initialiseurs de membres non statiques.
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!