estructura de inicialización con {0}

8

Estoy depurando un código que es esencialmente idéntico a esto:

struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };

Cuando hago una instancia de Bar , parece que ambos ay bse inicializan a cero. ¿Está esto garantizado? ¿Dónde puedo encontrar eso en la especificación?

XPlatformer
fuente
intente: struct Foo { int a{}; int b{}; };tenga en cuenta las llaves adicionales después de los nombres de las variables. entonces siempre obtendrá valores inicializados. si necesita iniciar con otros valores, con un comportamiento definido, debe escribir un ctor como para cualquier otra clase
skratchi.at
@ skratchi.at Esos no son paréntesis (el uso de paréntesis significaría algo más)
carreras ligeras en órbita el
1
Una pregunta tan simple en la superficie, pero C ++ init es tan complicado que entiendo por qué lo preguntas. Podría arriesgarme a adivinar que está obteniendo un inicio agregado adecuado aquí, pero sin profundizar en el estándar, no estoy seguro de cuál es la respuesta. ¿Qué tan triste es eso?
Carreras de ligereza en órbita
Esto es para matrices, pero ... stackoverflow.com/questions/1065774/…
YSC
Otra pregunta similar: stackoverflow.com/questions/1069621/…
Frodyne

Respuestas:

3

De acuerdo con cppreference.com

Si el número de cláusulas de inicialización es menor que el número de miembros [y bases (desde C ++ 17)] o la lista de inicializadores está completamente vacía, los miembros restantes [y bases (desde C ++ 17)] se inicializan [por su inicializadores de miembros predeterminados, si se proporcionan en la definición de clase, y de otro modo (desde C ++ 14)] mediante listas vacías, de acuerdo con las reglas habituales de inicialización de listas (que realiza la inicialización de valores para tipos que no son de clase y clases no agregadas con constructores predeterminados e inicialización de agregados para agregados). Si un miembro de un tipo de referencia es uno de estos miembros restantes, el programa está mal formado.

Foono tiene inicializadores miembro predeterminado ( int b{0};), por lo que bserá inicializado por lista de inicialización con una lista vacía, lo que significa el valor de inicialización para los tipos no clase: b = int() // = 0.

eike
fuente