相关内容:为什么标准容器要求allocator_type::value_type必须是元素类型?
据说以下内容自C++17起已被弃用:
template<>
struct allocator<void>;
我想知道它是否被弃用,因为主要模板现在已经能够容纳allocator<void>
,还是allocator<void>
的使用情况被废弃了。
如果是后者,我想知道原因。我认为allocator<void>
在指定未绑定到特定类型(仅为某些架构/元数据)的分配器时很有用。
相关内容:为什么标准容器要求allocator_type::value_type必须是元素类型?
据说以下内容自C++17起已被弃用:
template<>
struct allocator<void>;
我想知道它是否被弃用,因为主要模板现在已经能够容纳allocator<void>
,还是allocator<void>
的使用情况被废弃了。
如果是后者,我想知道原因。我认为allocator<void>
在指定未绑定到特定类型(仅为某些架构/元数据)的分配器时很有用。
并不是说std::allocator<void>
已经过时了,只是它不是一个显式的特化。
它曾经的样子大概是这样的:
template<class T>
struct allocator {
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
// These would be an error if T is void, as you can't have a void reference
typedef T& reference;
typedef const T& const_reference;
template<class U>
struct rebind {
typedef allocator<U> other;
}
// Along with other stuff, like size_type, difference_type, allocate, deallocate, etc.
}
template<>
struct allocator<void> {
typedef void value_type;
typedef void* pointer;
typedef const void* const_pointer;
template<class U>
struct rebind {
typdef allocator<U> other;
}
// That's it. Nothing else.
// No error for having a void&, since there is no void&.
}
template<class Alloc = std::allocator<void>>
class my_class; // allowed
int main() {
using void_allocator = std::allocator<void>;
using void_allocator_traits = std::allocator_traits<void_allocator>;
using char_allocator = void_allocator_traits::template rebind_alloc<char>;
static_assert(std::is_same<char_allocator, std::allocator<char>>::value, "Always works");
// This is allowed
void_allocator alloc;
// These are not. Taking the address of the function or calling it
// implicitly instantiates it, which means that sizeof(void) has
// to be evaluated, which is undefined.
void* (void_allocator::* allocate_mfun)(std::size_t) = &void_allocator::allocate;
void_allocator_traits::allocate(alloc, 1); // calls:
alloc.allocate(1);
}
std :: allocator
?即:std :: allocator <void>
。 - Gabriel Staples