je veux utiliser des chaînes de caractères à l'intérieur de l'Union. si j'écris comme ci-dessous
union U
{
int i;
float f;
string s;
};
Compilateur donne une erreur en disant: U::S a constructeur de copie.
J'ai lu un autre post pour d'autres moyens pour résoudre ce problème. Mais je veux savoir pourquoi le compilateur ne permet pas ceci en premier lieu?
EDIT: @KennyTM: Dans toute l'union, si le membre est initialisé d'autres auront des ordures valeurs, si aucun n'est initialisé toutes les ordures des valeurs. Je pense que, tagged union fournit simplement un peu de réconfort à l'accès valide les valeurs de l'Union. Votre question: comment avez-vous, ou le compilateur écrire un constructeur de copie pour l'union ci-dessus sans information supplémentaire? sizeof(string) donne 4 octets. Sur cette base, le compilateur ne peut pas comparer les autres membres de tailles et d'allouer plus grande répartition(4 octets dans notre exemple). Interne de la longueur de la chaîne n'a pas d'importance, car il va être stocké dans un emplacement séparé. Laissez la chaîne de la longueur. Tout ce que l'Union a savoir, c'est en invoquant la classe string constructeur de copie avec le paramètre de chaîne. Dans n'importe quelle manière que le compilateur trouve que le constructeur de copie doit être invoqué dans le cas normal, méthode similaire à être suivie, même lorsque la chaîne est à l'intérieur de l'Union. Donc, je pense compilateur pourrait faire comme, allouer 4 octets. Alors si une chaîne est affectée à s, puis en classe string prendra soin de répartition et de la copie de cette chaîne à l'aide de son propre allocateur. Donc, il n'y a aucune chance de corruption de la mémoire ainsi.
Est une chaîne n'existait pas au moment de l'Union de développement dans le compilateur ? Donc la réponse n'est pas claire pour moi encore. Je suis un nouvel arrivant sur ce site, si quelque chose de mal, pls de bien vouloir m'excuser.