Можно ли по-прежнему настраивать «эталонный» тип вектора STL?
Можно ли настроитьreference
изstd::vector
, До C ++ 11 это казалось возможным черезAllocator
параметр шаблона. Но не больше?
Согласно документации,http://en.cppreference.com/w/cpp/container/vector, reference
сейчас всегдаvalue_type
а такжеvalue_type
всегда параметр шаблонаT
.
Кажется невозможным даже при использованииallocator_traits
, http://en.cppreference.com/w/cpp/memory/allocator_traits
Есть ли обходной путь для этого?
Если нет, значит ли это, что я должен специализировать весьstd::vector
и, вероятно, воспроизвести все его функции, если я хочу иметь специальныйreference
тип основан на распределителе?
Если это так, вообще говоря, какова логика для всех этих ограничений? Заставить пользователя использоватьstd::vector<T, A>
всегда управлять обычной памятью (в которой,value_type = T
, reference = T&
а такжеpointer = T*
?)
Примечание: я знаю оstd::vector<bool>
полемика. Однако это немного более общий, потому что в принципе мне нужен обычайstd::vector<RegularType, special_allocator<RegularType>>
в основном для контроля типа возвратаoperator[](int)
на специальный объект прокси.
Конкретная реализация: я смотрю на источник stdlib GCC 6.3.1 и вstd_vector.h
можно прочитать:
template<typename _Tp, ...>
class vector : ...{
...
public:
typedef typename _Alloc_traits::reference reference;
};
который, по-видимому, указывает на то, что все еще возможно указать ссылочный тип черезallocator
(_traits
?).
Согласно документации,allocator
илиallocator_traits
не нужно иметьreference
тип. Кроме того, я не знаю, как настроить этот тип в любом случае.
GCC не следует стандарту? Или это просто косвенноallocator_traits<Allocator>::reference
вынужден бытьallocator_traits<Allocator>::value_type&
?