C++ contenitori standard e allocatori forniscono typedef per il tipo di puntatore utilizzato dal contenitore, cioè:tipi di puntatore personalizzata e contenitore/typedef allocatore
typename std::vector<T>::pointer
typename std::vector<T>::const_pointer
Il tipo di puntatore effettivo utilizzato per creare il typedef viene determinata tramite std::allocator_traits
typedef typename std::allocator_traits<Allocator>::pointer pointer;
Poiché ogni contenitore ha anche un typedef value_type
, presumibilmente lo scopo della pointer
typedef è per qualche strana situazione in cui il tipo di puntatore utilizzato è qualcosa altro rispetto a value_type*
. Non ho mai visto personalmente un caso d'uso per qualcosa del genere, ma suppongo che il comitato degli standard volesse fornire la possibilità di utilizzare tipi di puntatori personalizzati con contenitori.
Il problema è che questo sembra essere in contrasto con le definizioni previste le funzioni std::allocator_traits
. In particolare, in std::allocator_traits
abbiamo la funzione di construct
, che è definito come:
template <class T, class... Args>
static void construct(Alloc& a, T* p, Args&&... args);
... che ha appena chiama a.construct(p, std::forward<Args>(args)...)
Ma si noti che questa funzione non fa disposizioni per un tipo di puntatore personalizzato. Il parametro p
è un semplice puntatore nativo.
Quindi, perché non è la definizione di questa funzione qualcosa come:
template <class... Args>
static void construct(Alloc& a, typename Alloc::pointer p, Args&&... args);
Sembra senza questo, i contenitori che hanno usato std::allocator_traits<Alloc>::construct
fallirebbe se utilizzato con un allocatore che definisce un certo tipo di puntatore personalizzato.
Allora, che cosa sta succedendo qui? O sto fraintendendo lo scopo di avere pointer
typedefs in primo luogo?
'construct' è/deve essere aggiunto all'elemento * tipo *. allo stesso modo con 'destroy'. 'allocate' e' deallocate' non lo sono. Sia 'allocate' che' deallocate' si riferiscono al tipo 'pointer' che stai ispezionando. * Né * di quelle funzioni si occupa dell'oggetto reale * costruzione * e * distruzione *, e quindi non hanno alcuna garanzia di pinning per digitare 'T'. Sia 'construct' che' destroy', tuttavia, * do *. – WhozCraig
@dyp ':: std :: addressof (* p)', piuttosto;) –
L'intera idea di 'pointer! = Value_type *' sembra essere stata (sorta di) introdotta in C++ 11. Per quanto ho capito, in C++ 03, gli implementatori di container potevano assumere 'pointer == value_type *'. Attualmente sto cercando le proposte sul perché è stato cambiato. Sembra avere qualcosa a che fare con la carta dei concetti allocator (N2654) e potenzialmente il modello di allocatore dell'ambito (N2554). – dyp