聯合
聯合是非常有用的工具,但有一些重要的警告:
-
根據 C++標準,未定義的行為是訪問不是最近修改過的成員的 union 的元素。雖然很多 C++編譯器都以明確定義的方式允許這種訪問,但這些是擴充套件,並且不能在編譯器之間得到保證。
一個
std::variant
(因為 C++ 17)就像是一個聯合,只有它告訴你什麼目前,它包含(其可視狀態的一部分,是它擁有在給定時刻的值的型別:它強制值只能訪問發生在該型別)。 -
實現不一定將不同大小的成員對齊到同一地址。
聯合是非常有用的工具,但有一些重要的警告:
根據 C++標準,未定義的行為是訪問不是最近修改過的成員的 union 的元素。雖然很多 C++編譯器都以明確定義的方式允許這種訪問,但這些是擴充套件,並且不能在編譯器之間得到保證。
一個 std::variant
(因為 C++ 17)就像是一個聯合,只有它告訴你什麼目前,它包含(其可視狀態的一部分,是它擁有在給定時刻的值的型別:它強制值只能訪問發生在該型別)。
實現不一定將不同大小的成員對齊到同一地址。