2015-11-24 27 views
0

是否存在必须使用union且boost :: variant不能使用的任何用例?在联盟中推荐boost :: variant

更具体地说:工会可以解决和提升::变体不能有什么问题吗?

由于C++标准委员会建议using variant instead of union

+1

[Type-punning](https://en.wikipedia.org/wiki/Type_punning)?期望'union'参数的函数?当Boost不可用或无法使用? –

+3

@JoachimPileborg当你阅读的字段不是最后一个分配的字段时,是不是在C++中通过联合UB打字? –

+0

这是UB,但人们仍然使用它,因此编译器在一些有限的情况下不情愿地允许它。 –

回答

2

虽然工会在技术上允许某些变体不会的东西,但实际上这些东西都是未定义的行为。

请注意,这比Implementation Defined强得多:你不能依赖于同一个编译器做同样的事情两次,或者编译器的未来版本做同样的事情。

在可移植性方面,没有可用性,因为UB意味着“任何事情都可能发生”。

事实上,一些编译器治疗它定义现在实施实际上只是一个侧面说明在标准C++

的范围变的目标是让识别联合tuple(union, discriminant))安全,有点像array_view旨在使tuple(pointer, size)安全。