L'initialisation d'une union avec un non-trivial constructeur
J'ai une structure qui j'ai créer un constructeur pour initialiser les membres à 0. J'ai vu dans les anciens compilateurs que lorsqu'en mode release, sans en faire un memset à 0, les valeurs ne sont pas initialisés.
Je veux maintenant utiliser cette structure dans une union, mais des erreurs parce que c'est un non-trivial constructeur.
Donc, la question 1. Le compilateur par défaut mis en œuvre constructeur de garantir que tous les membres d'une structure sera initialisé à null? Le non-trivial constructeur a tout simplement un memset de tous les membres de '0' pour assurer la propreté de la structure.
Question 2: Si un constructeur doit être spécifié sur la base de la structure, comment un syndicat soit mis en œuvre pour contenir un élément et d'assurer un 0 initialisé élément de base?
Vous devez vous connecter pour publier un commentaire.
Question 1: par Défaut, les constructeurs ne initialiser POD membres à 0 selon la norme C++. Voir le texte cité ci-dessous.
Question 2: Si un constructeur doit être spécifié dans une classe de base, alors que la classe ne peut pas faire partie d'un syndicat.
Enfin, vous pouvez fournir un constructeur pour votre union:
Pour Q1:
À partir de C++03, 12.1 les Constructeurs, pg 190
La implicitement par défaut définis par le constructeur effectue l'ensemble des initialisations de l'
classe qui serait effectuée par un utilisateur écrit dans le constructeur par défaut pour la classe avec un vide mem-initialiseur de liste (12.6.2) et un vide corps de la fonction.
À partir de C++03, 8.5 Initialiseurs, page 145
Par défaut-initialiser un objet de type T signifie:
(article 9), le constructeur par défaut
pour T est appelé (et le
l'initialisation est mal formé, si T
n'a pas accessible par défaut
le constructeur);
À zéro-initialiser un objet de type T signifie:
Pour Le T2:
À partir de C++03, 12.1 les Constructeurs, pg 190
Un constructeur est trivial si il est implicitement déclarée de constructeur par défaut, et si:
de celui-ci), chaque classe a un trivial constructeur
À partir de C++03, 9.5 Syndicats, pg 162
Un syndicat peut avoir les fonctions membres (y compris les constructeurs et destructeurs), mais pas virtuel (10.3) de fonctions. Un syndicat ne peut pas les classes de base. Un syndicat ne peut pas être utilisée comme classe de base.Un objet d'une classe avec un non-trivial constructeur (12.1), un non-trivial constructeur de copie (12.8), un non-trivial destructeur (12.4), ou à un non-trivial copie opérateur d'affectation (13.5.3, 12.8) ne peut pas être membre d'un syndicat, ni un tableau de ces objets
Les choses ont changé pour le mieux en C++11.
Vous pouvez maintenant légalement le faire, que décrit par Stroustrup lui-même (j'ai atteint ce lien à partir de la Article de wikipédia sur le C++11).
L'exemple sur Wikipédia est comme suit:
Stroustrup va dans un peu plus en détail.
U
, je ne crois pas que c'est légal d'utiliser unU *
pour accéder à tout membre de l'union, si aucun syndicat de l'objet a été construit. [de base.la vie] Avant la durée de vie d'un objet a commencé, mais après le stockage de l'objet occupera a été attribué [...] un pointeur qui fait référence à l'emplacement de stockage [...] peut être déréférencé, mais [...]. Le programme a un comportement indéfini si [...] le pointeur est utilisé pour accéder à un non-membre de données statiques ou appeler un non-membre statique de la fonction de l'objetAutant que je sache, les membres du syndicat peuvent ne pas avoir les constructeurs ou destructeurs.
Question 1: non, il n'y a pas de garantie. Toute POD-membres qui ne sont pas dans la liste d'initialisation du constructeur obtient par défaut-initialisé, mais c'est avec un constructeur que vous définissez, et a une liste d'initialiseur. Si vous ne définissez pas un constructeur, ou vous pouvez définir un constructeur sans un initialiseur liste et le corps est vide, POD-membres ne sera pas initialisé.
Non-POD membres seront toujours construits par l'intermédiaire de leur constructeur par défaut, qui, si synthétisé, encore une fois ne serait pas initialiser POD-membres. Étant donné que les membres du syndicat peuvent ne pas avoir les constructeurs, vous serais assez bien être garanti que POD-membres de structs dans une union ne sera pas initialisé.
Question 2: vous pouvez toujours initialiser les structures et les syndicats de la sorte:
Comme mentionné dans Greg Rogers commentaire à unwesenaprès, vous pouvez donner à votre union un constructeur (et destructeur si vous le souhaitez):
Pouvez-vous faire quelque chose comme cela?
...ou peut-être quelque chose comme cela?
Vous aurez à attendre pour C++0x pour être pris en charge par les compilateurs de l'obtenir. Jusqu'alors, désolé.