std::visit仅对std::variant当前持有的单个活跃值执行一次访问,不能遍历所有可能类型;它适用于安全提取当前值或配合模板元编程枚举所有类型。

std::visit 不能直接“遍历” std::variant
这是最常见的误解:std::visit 不是 for-loop 那种遍历,它只对 std::variant 当前持有的**单个活跃值**执行一次访问。如果你试图用它“循环取出所有可能类型”,会编译失败或行为未定义。
根本原因在于 std::variant 在任意时刻最多只存一个值,它的“多种类型”是静态类型信息(编译期可知),不是运行时容器。
所以实际需求通常分两类:
- 你已知 variant 当前持有什么类型,想安全提取并处理 → 用
std::visit+ lambda 或 visitor 类 - 你想枚举 variant 所有可能的类型(比如做反射、调试打印、序列化)→ 需配合模板元编程,
std::visit本身不提供该能力
用 std::visit 安全访问当前值:lambda 写法最常用
这是绝大多数场景的正确打开方式:写一个能处理所有可能类型的 lambda,std::visit 自动匹配当前活跃类型并调用对应分支。
示例:
if constexpr
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











