Veuillez expliquer quelle est la différence entre union
et std::variant
et pourquoi std::variant
a été introduit dans la norme? Dans quelles situations devrions-nous utiliser std::variant
sur la vieille école union
?
De manière générale, vous devriez préférer variant
sauf si l'un des éléments suivants apparaît:
Vous trichez. Vous effectuez une punition de type ou d'autres choses qui sont UB mais vous espérez que votre compilateur ne cassera pas votre code.
Vous effectuez une partie de la pseudo-punition que les C++ union
sont autorisés à faire: la conversion entre les types compatibles avec la mise en page ou entre les séquences initiales courantes.
Vous avez explicitement besoin d'une copilité et/ou d'une compatibilité de mise en page triviales. variant<Ts>
ne sont pas tenus d'avoir une disposition particulière ou une copilité triviale. unions
des types de mise en page standard sont des mises en page standard, et union
s des types trivialement copiables sont copiables.
Notez qu'il y a ne proposition pour rendre variant
trivialement copiable si ses types de composants sont trivialement copiables . Il est proposé comme rapport de défaut contre C++ 17, donc ce comportement serait effectivement rétroporté dans C++ 17.
Vous avez besoin d'une prise en charge de bas niveau pour la commutation d'objets sur place. L'utilisation d'un tampon mémoire pour de telles choses ne fournit pas les garanties de copie triviales que vous pourriez sortir d'un union
.
La différence fondamentale entre les deux est que variant
sait quel type il stocke, tandis que union
attend de vous que vous suiviez de l'extérieur. Donc, si vous essayez d'accéder au mauvais élément dans un variant
, vous obtenez une exception ou nullptr
. En revanche, le faire avec un union
n'est qu'un comportement non défini.
union
est un outil de niveau inférieur et ne doit donc être utilisé que lorsque vous en avez absolument besoin.
variant
possède également des mécanismes pour faire des visites, ce qui signifie que vous évitez d'avoir un tas d'instructions if
où vous demandez "si c'est de type X, faites ceci. Si c'est de type Y, faites ça, etc ".