在阅读了一篇关于花哨指针的非常深入的文章之后,其中还描述了它们与分配器的相关性,我有一个疑问。该论文涵盖了花哨指针的几个方面,但没有指定
FancyPtr
类型的两个不同特化是否需要具有相同的 difference_type
。延伸来说,我有以下问题:
给定分配器
A
和两个不同的专业化 std::allocator_traits<A>::rebind_alloc<T>
和 std::allocator_traits<A>::rebind_alloc<U>
,size_type
和 difference_type
保证相同吗?
不,我在标准中没有看到任何此类要求。
在C++中,C++标准库提供了内存管理分配器的概念。
rebind
机制用于将一种类型的分配器转换为另一种类型的分配器,确保分配器的typedef
成员(如size_type
和difference_type
)适应新类型。
在大多数情况下,当您使用
rebind
使分配器适应不同类型时,反弹分配器的 size_type
和 difference_type
将保持与原始分配器相同。这是因为这些 typedef 通常依赖于分配器本身,而不是它分配的类型。
但是,C++ 标准并不强制要求
size_type
和 difference_type
在所有分配器专门化中必须相同,即使在重新绑定之后也是如此。这不是保证的行为。虽然 size_type
和 difference_type
在重新绑定后保持不变是很常见的,但在特定场景或自定义分配器中,这些类型可能会有所不同。
如果您想确保特定分配器或奇特指针的行为,您应该参考该特定分配器或指针类型的文档。始终依赖您正在使用的库或框架提供的文档和规范,因为可能存在特定于实现的差异或变化。