Ainda é possível personalizar o tipo de "referência" do vetor STL?
É possível personalizar oreference
de umstd::vector
. Até C ++ 11, parecia possível através doAllocator
parâmetro de modelo. Mas não mais?
De acordo com a documentação,http://en.cppreference.com/w/cpp/container/vector, reference
agora é semprevalue_type
evalue_type
é sempre o parâmetro do modeloT
.
Parece impossível mesmo usandoallocator_traits
, http://en.cppreference.com/w/cpp/memory/allocator_traits
Existe uma solução alternativa para isso?
Caso contrário, isso significa que eu tenho que especializar todostd::vector
e provavelmente reproduza toda a sua funcionalidade se eu quiser ter um especialreference
tipo baseado no alocador?
Se é assim, de um modo geral, qual é a lógica de todas essas restrições? Para forçar o usuário a usarstd::vector<T, A>
para gerenciar sempre a memória regular (na qual,value_type = T
, reference = T&
epointer = T*
?)
Nota: Estou ciente dasstd::vector<bool>
controvérsia. No entanto, isso é um pouco mais geral, porque, em princípio, eu preciso de um costumestd::vector<RegularType, special_allocator<RegularType>>
principalmente para controlar o tipo de retorno deoperator[](int)
para um objeto proxy especial.
Implementação específica: estou olhando a fonte stdlib do GCC 6.3.1 e emstd_vector.h
pode-se ler:
template<typename _Tp, ...>
class vector : ...{
...
public:
typedef typename _Alloc_traits::reference reference;
};
o que parece indicar que ainda é possível especificar um tipo de referência viaallocator
(_traits
?).
De acordo com a documentação,allocator
ou oallocator_traits
não precisa ter umreference
tipo. Além disso, não sei como personalizar esse tipo.
O GCC não está seguindo o padrão? Ou é simplesmente que indiretamenteallocator_traits<Allocator>::reference
é forçado a serallocator_traits<Allocator>::value_type&
?