No sé cuáles son las razones de todo el cambio (o cómo el estándar era antes), pero en la forma en que es, básicamente default-inicialización es o bien llamar a un constructor definido por el usuario o no hacer nada (un montón de agitar manualmente aquí: esto se aplica recursivamente a cada subobjeto, lo que significa que los subobjetos con un constructor predeterminado se inicializarán, los subobjetos sin constructores definidos por el usuario se dejarán sin inicializar).
Esto se describe en §8.5 Inicializadores, y no es trivial para navegar. Las definiciones para cero inicializan, default-inicializar y valor-INICIALIZACIÓN son el párrafo quinto:
Para cero inicializar un objeto de tipo T significa:
- si T es un tipo escalar (3.9), el objeto se establece en el valor de 0 (cero) convertido a T;
- si T es un tipo de clase no sindical, cada elemento de datos no estático y cada subobjeto de clase base se inicializan como cero;
- si T es un tipo de unión, el primer miembro de datos con nombre del objeto89) se inicializa en cero;
- si T es un tipo de matriz, cada elemento se inicializa en cero;
- si T es un tipo de referencia, no se realiza ninguna inicialización.
Para default-inicializar un objeto de tipo T significa:
- si T es a-POD no tipo de clase (cláusula 9), el constructor predeterminado de T se llama (y la inicialización está mal formada si T no tiene un constructor por defecto accesible);
- si T es un tipo de matriz, cada elemento se inicializa por defecto;
- de lo contrario, el objeto se inicializa en cero.
Para valor-inicializar un objeto de tipo T significa:
- si T es un tipo de clase (cláusula 9) con un constructor-declarado de usuario (12.1), entonces el constructor predeterminado de T se llama (y la inicialización está mal formada si T no tiene un constructor por defecto accesible);
- si T es un tipo de clase no sindical sin un constructor declarado por el usuario, entonces cada componente de datos no estáticos y de clase base de T tiene un valor inicializado;
- si T es un tipo de matriz, cada elemento se inicializa en valor;
- de lo contrario, el objeto es inicializada a cero
un programa que llama para default-inicialización o valor de inicialización de una entidad de tipo de referencia es Formato incorrecto. Si T es un tipo calificado para cv, la versión cv no calificada de T se usa para estas definiciones de inicialización cero, inicialización predeterminada e inicialización de valor.
La parte relevante del nuevo estándar C++ 11 es 8.5 ("Iniciales") cláusulas 5,6,7. –
Tal vez le da a las personas la opción de usar el controlador predeterminado o no. En la versión anterior de C++, los corchetes normalmente se perdían cuando no había parámetros. Entonces, tener los corchetes en la nueva opción afectará menos código heredado. – QuentinUK
No lo llamaría cambio, sino corrección. Al menos tiene sentido en el contexto de, p. std :: map donde los valores creados por [] tienen valor inicializado, por lo que, por ejemplo, std :: map todos U * están iniciados en 0 –
PlasmaHH