std::is_convertible仅检测From右值能否隐式转换为To,不检查构造、赋值或显式转换;指针转换受严格限制,如Base→Derived为false;模板约束中应优先使用is_constructible/is_assignable等语义更准确的特性。
std::is_convertible 的真实作用范围
std::is_convertible 判断的是 From 类型的**右值**能否隐式转换为 To 类型(即能否作为函数参数传入接受 To 的函数),不是检查构造、赋值或显式转换操作是否合法。
它不关心是否存在 operator To() 或 To(const From&) 构造函数本身是否 public,只看「在纯右值上下文中,该转换是否被标准允许」。比如:
struct A { operator int() const; };
struct B { B(int); };
static_assert(std::is_convertible_v); // ✅ 隐式转 int
static_assert(std::is_convertible_v); // ✅ int → B 构造可行
static_assert(std::is_convertible_v); // ❌ 无隐式转换路径
为什么 std::is_convertible_v 常返回 false
指针类型间转换受严格限制:std::is_convertible_v 是 true,但 std::is_convertible_v 是 false —— 因为向下转型需要 static_cast 或 dynamic_cast,不属于隐式转换范畴。
常见误判场景:
立即学习“C++免费学习笔记(深入)”;