联合
联合是非常有用的工具,但有一些重要的警告:
-
根据 C++标准,未定义的行为是访问不是最近修改过的成员的 union 的元素。虽然很多 C++编译器都以明确定义的方式允许这种访问,但这些是扩展,并且不能在编译器之间得到保证。
一个
std::variant
(因为 C++ 17)就像是一个联合,只有它告诉你什么目前,它包含(其可视状态的一部分,是它拥有在给定时刻的值的类型:它强制值只能访问发生在该类型)。 -
实现不一定将不同大小的成员对齐到同一地址。
联合是非常有用的工具,但有一些重要的警告:
根据 C++标准,未定义的行为是访问不是最近修改过的成员的 union 的元素。虽然很多 C++编译器都以明确定义的方式允许这种访问,但这些是扩展,并且不能在编译器之间得到保证。
一个 std::variant
(因为 C++ 17)就像是一个联合,只有它告诉你什么目前,它包含(其可视状态的一部分,是它拥有在给定时刻的值的类型:它强制值只能访问发生在该类型)。
实现不一定将不同大小的成员对齐到同一地址。