You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::variant异常行为疑问:存储int却识别为double

std::variant 三目运算符导致类型统一的问题
  • 问题根源在于三目运算符?:的类型推导规则:该运算符要求两个分支的结果类型必须能被统一为同一类型,编译器会自动执行隐式类型转换来满足这个要求。
  • 你的代码中,std::get<int>(lhs)返回int类型,std::get<double>(lhs)返回double类型,编译器会将int隐式转换为double。因此无论三目运算符走哪个分支,var的类型都会被推导为double——哪怕走int分支,4也会被转换成4.0存储到var中,这就是typeid(var)识别为double的原因。
  • 这是C++的预期行为,不属于编译器异常。

修正方案

如果想保留原std::variant的类型信息,不能通过三目运算符直接提取值(会丢失类型),可以采用以下两种方式:

方式一:使用std::visit(推荐)

std::variant<int, double> lhs = 4;
std::visit([](auto&& val) {
    using T = std::decay_t<decltype(val)>;
    if constexpr (std::is_same_v<T, int>) {
        std::cout << "int";
    } else if constexpr (std::is_same_v<T, double>) {
        std::cout << "double";
    }
}, lhs);

方式二:拆分判断逻辑

std::variant<int, double> lhs = 4;
if (std::holds_alternative<int>(lhs)) {
    int var = std::get<int>(lhs);
    std::cout << "int";
} else {
    double var = std::get<double>(lhs);
    std::cout << "double";
}

内容的提问来源于stack exchange,提问作者msg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:42:08