Quindi stavo osservando le specifiche di std::vector
e ho notato che reference
typedef modificato da Allocator::reference
in C++ 03 a value_type&
in C++ 11. Sono rimasto sorpreso, quindi ho iniziato a guardare più a fondo.Perché viene disattivato Allocator :: reference?
In C++ 03 §20.1.5 [lib.allocator.requirements] c'è tavolo 32 in cui X::reference
è definito come T&
e X::const_reference
è definito come T const&
.
Tuttavia, in C++ 11 §17.6.3.5 [allocator.requirements] c'è la tabella 28 in cui mancano reference
e const_reference
.
Successivamente abbiamo aggiunto il codice 20.6.8 std::allocator_traits
in C++ 11 che non include reference
. Ma il §20.6.9 std::allocator
fa.
Infine, c'è §23.2.1 [container.requirements.general] che definiscono X::reference
essere "lvalue di T
" e X::const_reference
essere "Ivalue const T
".
Così, Googled e trovato questo documento (1, 2) che si propone la rimozione di reference
dai requisiti allocatore, ma non menziona alcuna logica dietro di esso. Ma c'è anche un LWG issue che si oppone al cambiamento.
Inoltre, ho trovato the interview with Alexander Stepanov in cui parla di come reference
incapsula layout di memoria specifiche della macchina e Herb Sutter's post in cui parla di prendere puntatori a elementi contenitori, i requisiti di container e di come std::vector<bool>
non è un contenitore.
Quindi, cosa ne pensi di tutto questo? reference
è stato utile, è stato utile? In che modo i riferimenti "fantasiosi" rientrano nello standard? È una mossa audace eliminarli completamente, rendere più rigidi i requisiti del contenitore e deprecare std::vector<bool>
?
domanda ben ricercata – David
No, non è molto audace. Interromperò la compilazione se qualcuno tenta di istanziare std :: vector –