2012-01-20 29 views
6

Cuando accedo a un elemento en std::unordered_map using operator [] por primera vez, se crea automáticamente. ¿Qué (si hay) son garantías sobre su inicialización? (¿Se garantiza que se inicializó el valor o solo se construirá)?std :: unordered_map initialization

Ejemplo:

std::unordered_map<void *, size_t> size; 
char *test = new char[10]; 
size[test] += 10; 

el tamaño [test] garantiza que sea 10 al final de esta secuencia?

Respuesta

16

¿El tamaño de [prueba] es 10 al final de esta secuencia?

Sí. En la última línea de su código, size[test] valor inicializa el elemento de T(), o en este caso size_t():

C++ 11 23.4.4.3 mapa de acceso elemento [map.access]

T& operator[](const key_type& x) ;

1 Efectos: si no hay una clave equivalente a x en el mapa, inserta value_type (x, T()) en el mapa.

En cuanto a T(), el lenguaje exacto es un algo complicada, así que trataré de citar los bits relevantes:

C++ 11 8.5.16 La semántica de inicializadores son los siguientes.

- Si el inicializador es(), el objeto se inicializa en valor.


8.5.7 Para valor inicializar un objeto de tipo T significa:

- si T es un tipo de clase (posiblemente cv-cualificado) ...

- si T es una (posiblemente cv-calificada) de tipo no-unión de clase ...

- si T es un tipo de matriz, cada elemento es valor-inicializado;

- de lo contrario, el objeto se inicializa en cero.


8.5.5 Para cero inicializar un objeto o de referencia de tipo T significa:

- si T es un escalar tipo (3.9), el objeto se establece en el valor 0 (cero), tomado como una expresión de constante integral, convertida a T;

+0

He leído esa parte de los documentos, pero no estaba seguro de las implicaciones. ¿Qué significa "construido por defecto" para un tipo integral como size_t? (¿Puedes citar un estándar, preferiblemente?) – Suma

+0

@Suma: los tipos integrales no son tipos de clase, por lo que no tienen constructores. Inicializar el valor de esos tipos equivale a cero inicialización. (Capítulo 8.) –

+0

@KerrekSB ¿Estás seguro de que no estás confundiendo C++ con Java? Builtins no construye por defecto a cero. – spraff

0

¿Cuál es la diferencia? La inicialización del valor para objetos de tipo clase implica una construcción predeterminada, por lo que la respuesta es "ambos". Para un mapa <K, V>, el nuevo objeto se inicializará con V().

Todos los contenedores estándar inicializan nuevos elementos con valor o inicialización directa (este último posiblemente a través de una construcción de copia). No es posible que los nuevos elementos de contenedor estándar estén en un estado "no inicializado" (es decir, no existe ningún mecanismo que predeterminado -inicialice elementos).

+0

Supuse "construido" en el sentido de cuando uso la variable int miembro en una clase, el constructor de clase predeterminado no inicializa el valor. Supongo que tienes razón, pero ¿la inicialización del valor está garantizada por la frase "construido por defecto"? ¿Qué pasa si V será POD? ¿Se construirá por defecto (es decir, sin inicializar) o se inicializará el valor? – Suma

+0

@Suma: 'V' tiene un valor inicializado, por lo que si' V' es fundamental, se inicializa en cero, y si es de clase, se construye por defecto. Para los tipos compuestos, aplica las reglas recursivamente. –

Cuestiones relacionadas