std::common_type按三元运算符语义推导类型,即decltype(std::declval() ? std::declval() : std::declval()),依赖通常算术转换规则,不考虑数值范围或溢出风险。
std::common_type 的类型推导规则是什么
std::common_type 不是“找一个能容纳所有类型的最小类型”,而是严格按 std::declval + decltype(t1 ? t2 : t3) 的三元运算符语义推导:它尝试构造一个合法的条件表达式,再取其结果类型。这意味着它依赖于内置三元运算符的转换规则,而非数值范围或隐式转换链。
例如:std::common_type_t 在大多数平台是 unsigned int(因为 int 可隐式转为 unsigned int,但反之不成立),而 std::common_type_t 是 int(整型提升规则生效)。
常见误区是认为它会“向上取公共基类”或“选最大宽度类型”——它不会。它只模拟 ? : 行为,且仅对可比较/可条件选择的类型组合有效。
为什么 std::common_type 推导出 double 而不是 long double
因为标准规定:当操作数为算术类型时,三元运算符先执行通常算术转换(usual arithmetic conversions),而 int 和 double 的转换结果是 double(int 升级为 double,不进一步升到 long double)。std::common_type 完全复用这套规则。
立即学习“C++免费学习笔记(深入)”;
验证方式:
static_assert(std::is_same_v<std::common_type_t, double>); // 通过
注意以下几点: