2010-10-31 13 views
6

Los asignadores STL requieren esta forma constructor (20.1.5): X a(b); con el requisito de que Y(a) == b;asignador STL, constructor de copia de otro tipo, remapean

En la implementación estándar esto implica, y se implementa como:

template<class U> allocator(const allocator<U> & o) throw() 

Tengo problemas para entender por qué existe este requisito. Entiendo que los asignadores deben ser estáticos (no tienen ningún estado), pero ¿por qué debería poder convertirlos así?

Respuesta

6

Para permitir la construcción desde otros asignadores, ya que los contenedores necesitan utilizar un tipo de asignador diferente al especificado. Las listas y los mapas, por ejemplo, asignan su tipo de nodo interno en lugar del tipo de valor que exponen.

El código es similar a:

template<class T, class Alloc=std::allocator<T> > 
struct Container { 
    typedef T value_type; 
    typedef Alloc allocator_type; 

private: 
    struct Node {/*...*/}; 
    typedef typename Alloc::template rebind<Node>::other RealAllocatorType; 
    RealAllocatorType allocator; 
}; 
+1

Solamente los contenedores que almacenan todos los artículos de forma contigua (vector, String) puede utilizar el tipo de imputación dada directamente. –

+1

Gracias. Ese es un requisito realmente horrible. Estoy empezando a estar de acuerdo con Scott Meyer aquí, el sistema de asignación parece ser básicamente basura. –

+0

@edA: Como tantas noches en la ciudad, tenía sentido hace 15 años. Estoy de acuerdo hoy. :) –

Cuestiones relacionadas