std::variant类型安全联合体中是否允许存放std::vector?
std::variant存储std::vector的相关问题解答
核心结论
std::variant完全可以正常存储std::vector,不存在任何限制。
规则澄清
你看到的官方说明如下:
variant不允许持有引用、数组或void类型。
这里提到的「不允许持有的数组」,特指C++原生内建数组类型(例如int[5]、char[]等),并不包含std::vector、std::array这类标准库封装的容器类类型:
- std::vector是标准库模板实例化得到的类类型,本身不属于原生数组范畴,完全符合std::variant的类型要求
- 原生C++联合体无法存储std::string、std::vector这类非平凡类型,是因为原生union没有自动处理非平凡类型的构造、析构逻辑的能力,而std::variant作为类型安全的联合体实现,原生支持这类有自定义构造/析构函数的类类型,只要所有备选类型都满足可析构要求即可正常使用。
用法示例
你可以直接编写如下合法代码:
#include <variant> #include <vector> #include <string> int main() { // 声明同时支持int、vector<double>、string三种类型的variant std::variant<int, std::vector<double>, std::string> val; // 赋值为vector类型 val = std::vector<double>{1.2, 3.4, 5.6}; // 切换为string类型也完全正常 val = "test string"; return 0; }
补充说明
std::vector的底层确实通过动态分配的原生数组存储数据,但vector本身是封装完成的独立类对象,和原生数组属于完全不同的类型,自然不受原生数组相关限制的约束。
内容的提问来源于stack exchange,提问作者tenslw
相关产品推荐
相关产品推荐

