为何std::allocator的rebind<U>::other在C++17弃用、C++20移除?
std::allocator 中
rebind<U>::other 被C++标准弃用的原因 - 分配器访问层统一:C++11引入
std::allocator_traits作为所有分配器的统一访问入口后,标准库所有组件都不再直接调用分配器自身的嵌套类型/成员,而是统一通过allocator_traits查询分配器特性。std::allocator_traits<Alloc>::rebind_alloc<U>已经完全替代了Alloc::rebind<U>::other的功能,还可以兼容没有内置rebind实现的自定义分配器,大幅降低了自定义分配器的实现门槛。 - 消除冗余设计:对
std::allocator本身来说,rebind<U>::other的功能完全冗余——std::allocator<T>重绑定到类型U的结果就是std::allocator<U>,不需要额外通过嵌套模板推导,保留该接口没有实际价值,还容易让使用者混淆分配器原生接口和allocator_traits的统一接口规则。 - 降低语法复杂度:直接访问分配器的嵌套模板类型需要额外书写
typename、template关键字消除歧义,形如typename Alloc::template rebind<U>::other的写法繁琐且极易出错,而allocator_traits的相关接口已经在标准库内部封装了推导逻辑,普通开发者很少需要手动编写这类推导代码,也不需要额外记忆分配器原生的嵌套接口规则。
补充说明:该弃用规则仅适用于标准库提供的
std::allocator,自定义分配器仍然可以自行实现rebind<U>::other特性,allocator_traits会自动识别并优先调用自定义分配器的原生rebind实现,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者dasfex
相关产品推荐
相关产品推荐

