Stavo cercando di utilizzare un allocatore personalizzato per std::vector<char>
, ma ho notato che std::vector
non ha bisogno/utilizzare alcuna delle funzioni membro dal mio allocatore. Com'è possibile?L'allocatore personalizzato per std :: vector <char> viene ignorato
#include <vector>
struct A : private std::allocator<char> {
typedef std::allocator<char> alloc;
using alloc::value_type;
using alloc::pointer;
using alloc::const_pointer;
using alloc::difference_type;
using alloc::size_type;
using alloc::rebind;
// member functions have been removed, since the program compiles without them
};
int main() {
std::vector<char, A> v;
v.resize(4000);
for (auto& c : v)
if (c)
return 1; // never happens in my environment
return 0; // all elements initialized to 0. How is this possible?
}
Stavo cercando il programma di cui sopra con una linea C++ 11 compilatore (LiveWorkSpace), fornendo g ++ 4.7.2, 4.8 e 4.6.3.
Fondamentalmente allocate()
, deallocate()
, construct()
e destroy()
non sono definiti nel mio allocator, ma il programma viene compilato e tutti gli elementi vengono inizializzati a 0.
In realtà, perché è preferibile che funzioni ancora se l'utente fornisce un 'std :: allocator' come allocatore per un 'vector '? Non ha più senso ottenere un errore del compilatore? –
Non sono sicuro che sia desiderabile personalmente, ma è sempre stato così. Per altri contenitori ha più senso: se un utente dice 'std :: map, std :: allocator >>' è una comodità accettarlo anche se tecnicamente l'allocatore deve essere 'std :: allocator >' –
@AndyProwl - gli allocatori in realtà dovrebbero essere parametri template template, ma i parametri template template non esistevano al momento STL (NOTA: ** STL **, non ** Standard Library **) è stato progettato, quindi 'rebind' è stato creato. –