为何boost::intrusive_ptr无法比较不同const限定的实例?
boost::intrusive_ptr不同const限定实例无法比较:设计还是疏忽?
这是有意的设计选择,并非疏忽。
为什么裸指针和std::unique_ptr支持这种比较?
- 裸指针的
const S*与S*能直接比较,是因为C++允许S*隐式转换为const S*,比较时会自动完成转换后再对比指针地址。 std::unique_ptr提供了模板化的比较运算符,允许跨cv限定的实例比较(比如unique_ptr<S>和unique_ptr<const S>),内部会提取底层指针并完成合法的类型转换后再比较。
boost::intrusive_ptr的设计考量
boost::intrusive_ptr的比较运算符是非模板化的,仅支持完全相同类型的实例之间比较(包括cv限定符也必须一致)。这种设计是为了严格保证类型安全,避免潜在的意外转换——比如防止开发者误将底层指针可转换但逻辑上不相关的intrusive_ptr实例进行比较。
手动实现跨const限定的比较
如果需要比较不同const限定的boost::intrusive_ptr,直接提取底层指针即可:
if(boost_const_ptr.get() < boost_ptr.get()) {}
内容的提问来源于stack exchange,提问作者αλεχολυτ
相关产品推荐
相关产品推荐

