分配器是否必须是可互换的?

Are allocators required to be interconvertible?

提问人:glades 提问时间:7/21/2023 更新时间:7/21/2023 访问量:36

问:

很长一段时间以来,我一直在想如何将 A 类型的分配器分配给需要 B 类型分配器的对象。 检查以下代码:

演示

#include <iostream>
#include <exception>
#include <vector>
#include <array>
#include <memory_resource>

template <typename StringType = std::string>
struct MyContainer {
    using allocator_type = StringType::allocator_type;

    MyContainer(allocator_type allocator = {})
        // allocator_type = std::pmr::polymorphic_allocator<char>
        : str_{ allocator } // expects allocator of type std::pmr::polymorphic_allocator<char>
        , channels_ { allocator } // expects allocator of type std::polymorphic_allocator<int>
    {
        
    }

    StringType str_;

    using T = int;
    std::vector<T, typename std::allocator_traits<allocator_type>::template rebind_alloc<T>>
        channels_;
};


int main() {
    std::array<std::byte, 100> buf;
    std::pmr::monotonic_buffer_resource mbr{ buf.data(), buf.size() };
    std::pmr::polymorphic_allocator<std::byte> pa{&mbr};
    
    MyContainer<std::pmr::string> c(pa); // passed allocator type is std::pmr::polymorphic_allocator<std::byte>
}

正如你所看到的,传递给 MyContainer 实例的分配器类型只是 ,即使它期望一个 which 是从字符串类型派生的。话又说回来,MyContainer 类中的 vector 对象实际上需要一个 ,但是它会毫无问题地吞噬传递的分配器 ()。这是如何工作的?分配器是否允许根据标准转换为任何其他类型的分配器?如果是这样,为什么我还需要一个?std::pmr::polymorphic_allocator<std::byte>std::pmr::polymorphic_allocator<char>std::pmr::polymorphic_allocator<int>std::pmr::polymorphic_allocator<char>rebind_alloc

C++ 隐式转换 分配器

评论

0赞 BoP 7/21/2023
您需要获取类型的名称。不获取转换后的值rebind_alloc
0赞 glades 7/24/2023
@BoP 好的,但是分配器规范是否要求此转换可用?我看到std::alloator也定义了一个转换构造函数。
1赞 BoP 7/24/2023
是的,转换是必需的。许多标准容器需要重新绑定其分配器。例如,a 不分配 T,而是分配一些内部结构,其中包含 T 和一对指针(用于获取链表中的链接)。std::list<T>

答: 暂无答案