在哪里使用std :: variant over union?

请解释unionstd::variant之间的区别是什么,为什么将std::variant引入标准中? 在什么情况下,我们应该使用std::variant代替旧的union

Kirill Kobelev asked 2020-08-01T00:55:04Z
1个解决方案
65 votes

一般来说,除非出现以下情况之一,否则您应该更喜欢variant

  1. 你在作弊 您正在执行类型调整或其他类似UB的操作,但是希望编译器不会破坏您的代码。

  2. 您正在做一些C ++ variant所允许的伪伪造行为:在兼容布局的类型之间或在常见的初始序列之间进行转换。

  3. 您明确需要琐碎的可复制性和/或布局兼容性。 variant不需要具有任何特定的布局或简单的可复制性。 标准布局类型的if是标准布局,普通复制类型的variants是普通复制。

    请注意,如果其组件类型是可微复制的,则建议将variant进行微复制。 它被建议作为针对C ++ 17的缺陷报告,因此,此行为将有效地反向移植到C ++ 17中。

  4. 您需要对对象进行就地切换的低级支持。 对于此类事情使用内存缓冲区并不能提供可以让您摆脱variant的繁琐复制保证。

两者之间的基本区别是variant知道它存储哪种类型,而if希望您从外部跟踪该类型。 因此,如果尝试在variant中访问错误的项目,则会得到异常或nullptr。相比之下,使用union只是未定义的行为。

variant是较低级别的工具,因此仅在绝对需要该较低级别的情况下才应使用。

variant也具有进行访问的机制,这意味着您可以避免一堆if语句询问“是否为X类型,请执行此操作。如果为Y类型,请执行此操作,等等”。

Nicol Bolas answered 2020-08-01T01:07:50Z
translate from https://stackoverflow.com:/questions/42082328/where-to-use-stdvariant-over-union