informacion - que significa void en c++
¿El significado de la inicialización predeterminada cambió en C++ 11? (3)
C ++ 2003 8.5 / 5 dice:
Para inicializar por defecto un objeto de tipo T significa:
- si T es un tipo de clase no POD (cláusula 9), se llama al constructor predeterminado para T (y la inicialización no es correcta si T no tiene un constructor por defecto accesible);
- si T es un tipo de matriz, cada elemento está inicializado por defecto;
- de lo contrario, el objeto tiene cero inicialización .
[Énfasis añadido.]
El estándar C ++ 2011 cambió el último elemento a
- de lo contrario, no se realiza ninguna inicialización .
Parece que sería un cambio radical para algunos programas. ¿Fue esto intencional?
Editar
Aquí hay un código para motivar esta pregunta:
class Foo {
public:
Foo() : m_values() {}
int m_values[3];
};
Antes de C ++ 11, pensé que la mención explícita de m_values
en el constructor predeterminado predefiniría esa matriz. Y dado que los elementos de la matriz son escalares, esperaba que eso significara que los valores estaban todos en 0.
En C ++ 11, parece que ya no hay garantía de que esto suceda. Pero tal vez, como señaló Mooing Duck en los comentarios, tal vez este ya no sea un caso de inicialización predeterminada, sino de alguna otra forma que preserve el comportamiento esperado. Citaciones bienvenidas.
Estrictamente hablando, la definición de default-initialize ha cambiado de C ++ 03 a C ++ 11. Pero también se debe tener en cuenta que las situaciones en las que un objeto es _default-initialize_d han cambiado:
§8.5p9 C ++ 03 estados:
Si no se especifica un inicializador para un objeto, y el objeto es de un tipo de clase no POD (posiblemente cv calificado) (o matriz del mismo), el objeto se inicializará por defecto; si el objeto es de un tipo cualificado por constantes, el tipo de clase subyacente tendrá un constructor predeterminado declarado por el usuario. De lo contrario, si no se especifica un inicializador para un objeto no estático, el objeto y sus subobjetos, si los hay, tienen un valor inicial indeterminado; Si el objeto o cualquiera de sus subobjetos son de tipo cualificado por const, el programa está mal formado.
§8.5p11 C ++ 11 estados:
Si no se especifica un inicializador para un objeto, el objeto se inicializa por defecto; si no se realiza la inicialización, un objeto con duración de almacenamiento automática o dinámica tiene un valor indeterminado.
Como @JamesKanze ya señaló, la inicialización predeterminada se realiza en C ++ 03 cuando no se especifica un inicializador para un objeto de tipo de clase que no es POD. En C ++ 11, un objeto (de tipo arbitrario) se inicializa por defecto si no se especifica ningún inicializador. Debido a este cambio, la definición de inicialización por defecto también se tuvo que cambiar para ser compatible con C ++ 03.
Su ejemplo no tiene nada que ver con la inicialización por defecto . Siempre ha sido el caso que un objeto cuyo inicializador es un conjunto vacío de paréntesis se inicializa en valor .
Los efectos finales son casi lo mismo. En C ++ 03, el uso de initialize por defecto se restringió al tipo de clase no POD, por lo que el último punto nunca se aplicó. En C ++ 11, el estándar simplifica la redacción al eliminar la condición con respecto a dónde se usó la inicialización predeterminada, y cambia la definición de inicialización predeterminada para cubrir todos los casos de manera que corresponda a lo que sucedió antes.
Según cppreference.com (porque usa un lenguaje más amigable que el estándar):
La inicialización predeterminada se realiza en tres situaciones:
3) cuando una clase base o un miembro de datos no estático no se menciona en una lista de inicializadores del constructor y se llama a ese constructor.
La inicialización del valor se realiza en tres situaciones:
3,7) cuando un miembro de datos no estáticos o una clase base se inicializa utilizando un inicializador de miembro con un par vacío de paréntesis
or braces (since C++11)
Tenga en cuenta que la parte de C ++ 11 pertenece a las or braces
, no a todo el párrafo.
Y:
Para inicializar con valor un objeto de tipo T significa:
- si T es un tipo de matriz, entonces cada elemento tiene un valor inicializado;
- de lo contrario, el objeto tiene cero inicialización
Por lo tanto, en C ++ 11 , la inicialización predeterminada no inicializa en cero los miembros, pero sí lo hace la inicialización de valores .