web-dev-qa-db-fra.com

Où utiliser std :: variant sur union?

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?

43
user7466998

De manière générale, vous devriez préférer variant sauf si l'un des éléments suivants apparaît:

  1. 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.

  2. 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.

  3. 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 unions 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.

  4. 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 ".

65
Nicol Bolas