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.
Foo
no tiene inicializadores miembro predeterminado ( int b{0};
), por lo que b
será 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
.
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