CodeWalk

联合体(union)的高级用法与类型安全替代方案

作者:孤独的心 · 2026-05-30 12:55

C++中union相比C语言有哪些增强?为什么说union天生是类型不安全的?C++17中std::variant如何替代union?联合体在标准库(如variant实现)中的角色是什么?

回答

孤独的心

C++ union比C增强:可以包含构造函数/析构函数(但必须手动管理生命期),可以包含有自定义构造函数的成员(需显式调用析构)。不安全:union不跟踪当前活跃成员,错误读取非活跃成员是未定义行为(UB)。std::variant(C++17):类型安全的tagged union——std::variant<int,float,string>通过索引跟踪当前类型,提供valueless_by_exception()std::visit()访问。variant内部实现通常含一个union+判别式索引。标准库中union的角色:variant内部实现使用union(配合placement new管理生命期);optional也可用union实现;std::string的SSO实现使用union(短缓冲区vs堆指针)。C++20的std::start_lifetime_as可帮助简化union管理。建议:新代码优先使用variant替代union;仅在嵌入式/低级内存操作中使用裸union。