std::holds_alternative用于检查variant当前是否持有指定类型,仅判断类型状态而非值内容,返回bool结果;必须显式指定模板参数类型,严格匹配cv限定符与引用,不支持运行时类型推导。

std::holds_alternative 用来检查 variant 当前是否持有某类型
它不关心“里面是什么值”,只回答“现在存的是不是 T 这个类型”。返回 true 表示当前 active 的确实是该类型,false 表示不是——哪怕值能隐式转换、或有同名嵌套类型,也不影响判断。
常见误用是把它当 std::is_same 或类型转换工具,但它只是“状态快照”,和构造方式、赋值来源完全无关。
基本用法:模板参数必须显式写出目标类型
不能靠推导,也不能传变量或运行时类型信息。必须写死类型名,比如 std::holds_alternative<int></int>,不能写成 std::holds_alternative<decltype></decltype>(除非 x 是编译期已知的类型别名)。
-
std::variant<int std::string> v = 42;</int>→std::holds_alternative<int>(v)</int>返回true -
v = "hello";→ 同样调用std::holds_alternative<int>(v)</int>就变成false - 如果
v是std::monostate(空状态),所有std::holds_alternative<t>(v)</t>都返回false
容易踩的坑:const 限定符、引用、cv-qualifier 会影响匹配
std::holds_alternative 匹配的是 variant 中实际存储的类型,不是你“想查”的类型。如果 variant 存的是 const int,而你查 int,结果是 false;同样,存的是 int&(虽然 variant 不允许直接存引用,但通过 std::reference_wrapper 可能间接出现)也会不匹配。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- variant 定义为
std::variant<const int double></const>,则std::holds_alternative<int>(v)</int>是false,必须写std::holds_alternative<const int>(v)</const> - 使用
std::get_if<t>(&v)</t>时也有同样要求,类型必须一字不差 - 建议统一用非 cv-qualified 类型定义 variant,避免无谓的匹配失败
配合 std::get_if 使用更安全,避免抛异常
单独用 std::holds_alternative 只是判断,真正取值还得靠 std::get 或 std::get_if。直接 std::get<t>(v)</t> 在类型不匹配时会抛 std::bad_variant_access,而 std::get_if<t>(&v)</t> 返回指针,空指针表示不匹配——更适合条件分支逻辑。
if (std::holds_alternative<std::string>(v)) {
auto* s = std::get_if<std::string>(&v); // 安全,s 非空
do_something(*s);
}注意:std::holds_alternative 和 std::get_if 的类型参数必须一致,否则行为未定义;且两者都对 std::monostate 返回 false / nullptr。
最常被忽略的是:variant 可能处于 valueless_by_exception 状态(比如移动后异常),此时所有 std::holds_alternative 都返回 false,但这种状态极少见,通常只在异常安全边界需要考虑。

















