提问人:glades 提问时间:7/21/2023 更新时间:7/21/2023 访问量:36
分配器是否必须是可互换的?
Are allocators required to be interconvertible?
问:
很长一段时间以来,我一直在想如何将 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
答: 暂无答案
评论
rebind_alloc
std::list<T>