- Si le syndicat est CopyConstructable et assignable, il répond aux exigences de std :: vector.
- Oui:
MyUnion* ptr = new MyUnion();
- Un conteneur de pointeurs fonctionne dans certaines situations, mais si vous voulez un conteneur de posséder pointeurs, regardez Boost de ptr_* containers. Cependant, ici, il semble que vous auriez soit un conteneur de non-pointeurs ou un conteneur de pointeurs non propriétaires, dont l'un est bien et commun pour le vecteur.
Tous les types sont, par défaut, à la fois CopyConstructable et assignable. ("Copyable" est utilisé pour signifier l'union de ces concepts, cependant la norme les spécifie individuellement.) C'est parce que copy ctors et op = sont ajoutés aux classes (les unions sont un type de classe) sauf dans certaines circonstances. Il ya quelques references en ligne, mais je ne connais pas un seul, disponible gratuitement en ligne, qui les énonce.
Vous devez sortir de votre chemin pour l'empêcher, comme:
- faire la copie cteur ou op = non publique
- faire la copie cteur ou op = prendre un non-const la référence
- envoyer le type de classe d'un élément non-CopyConstructable ou non affectable
Exemple:
union CopyableUnion {
int n;
char c;
double d;
};
union NonCopyableUnion {
int n;
char c;
double d;
NonCopyableUnion() {} // required, because any user-defined ctor,
// such as the private copy ctor below, prevents the supplied
// default ctor
private:
NonCopyableUnion(NonCopyableUnion const&);
NonCopyableUnion& operator=(NonCopyableUnion const&);
};
int main() {
CopyableUnion a;
CopyableUnion b = a; // fine, uses copy ctor
b = a; // fine, uses op=
NonCopyableUnion c;
NonCopyableUnion d = c; // compile error (copy ctor)
d = c; // compile error (op=)
return 0;
}
Note: Et juste parce que quelque chose est Copiable, ne signifie pas qu'il fait ce que vous voulez!Exemple:
struct A {
int* p;
A() : p(new int()) {}
// the provided copy ctor does this:
//A(A const& other) : p(other.p) {}
// which is known as "member-wise" copying
~A() { delete p; }
};
int main() {
A a;
{
A b = a;
assert(b.p == a.p); // this is a problem!
} // because when 'b' is destroyed, it deletes the same pointer
// as 'a' holds
return 0; // and now you have Undefined Behavior when
// ~A tries to delete it again
}
La même chose est vraie pour les syndicats, bien sûr. Le correctif applique également, bien que, ainsi:
struct A {
int* p;
A() : p(new int()) {}
A(A const& other) : p(new int(*other.p)) {}
~A() { delete p; }
};
(Si vous avez repéré, oui, A a un problème si vous essayez toujours d'utiliser op =, exactement de la même manière comme il l'avait à l'origine avec la copie ctor.)
comment puis-je déterminer si une union est CopyConstructable et Assignable? – derrdji
@derrdji: Je pense que tant que tous les membres sont (ne le niez pas explicitement) et l'union elle-même ne le nie pas explicitement. – Sydius