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
相关产品推荐
相关产品推荐

