让我们从分配器类型的标准要求开始:
17.6.3.5.4-5
分配器类型X应满足 CopyConstructible (17.6.3.1)的要求。 X ::指针,X :: const_pointer,X :: void_pointer和X :: const_void_pointer类型应满足NullablePointer(17.6.3.3)的要求。对这些类型的构造函数,比较运算符,复制操作,移动操作或交换操作不应通过异常退出。 X :: pointer和X :: const_pointer也应满足随机访问迭代器(24.2)的要求。
template <class Tp>
struct SimpleAllocator {
typedef Tp value_type;
SimpleAllocator(ctor args);
template <class T> SimpleAllocator(const SimpleAllocator<T>& other);
Tp* allocate(std::size_t n);
void deallocate(Tp* p, std::size_t n);
};
template <class T, class U>
bool operator==(const SimpleAllocator<T>&, const SimpleAllocator<U>&);
template <class T, class U>
bool operator!=(const SimpleAllocator<T>&, const SimpleAllocator<U>&);
标准对scoped_allocator_adaptor
的评价是什么:
20.13.3.1
scoped_allocator_adaptor();
效果: value-initialize OuterAlloc基类和内部分配器对象。
我正在以微不足道的方式使用我的分配器。
template<typename T>
using sa_t =
std::scoped_allocator_adaptor<SimpleAllocator<T>> ;
int main()
{
std::vector<int, sa_t<int>> xxx{ sa_t{ SimpleAllocator{Arg{}} } };
return 0;
}
问题是:
这是否意味着scoped_allocator_adaptor意味着最小的分配器接口不够并且必须提供空状态分配器?
我是否可以创建一个可以默认构造的分配器,但是它可以抛出任何分配/释放内存的请求?换句话说:scoped_allocator_adaptor客户端(我在看你,标准容器)是否被迫忽略这样的默认构造适配器?