Tengo una pregunta sobre una de las características de c ++ 20, inicializadores designados (más información sobre esta característica aquí )
#include <iostream>
constexpr unsigned DEFAULT_SALARY {10000};
struct Person
{
std::string name{};
std::string surname{};
unsigned age{};
};
struct Employee : Person
{
unsigned salary{DEFAULT_SALARY};
};
int main()
{
std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed
std::cout << std::boolalpha << std::is_aggregate_v<Employee> << '\n'; // true is printed
Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // it's ok
Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile, WHY ?
// For e2 compiler prints a warning "missing initializer for member 'Employee::<anonymous>' [-Wmissing-field-initializers]"
Employee e2 {.salary{55000}};
}
Este código fue compilado con gcc 9.2.0 y -Wall -Wextra -std=gnu++2aflags.
Como puede ver arriba, ambas estructuras Persony Employeeson agregados, pero la inicialización del Employeeagregado no es posible utilizando inicializadores designados.
¿Podría alguien explicarme por qué?
publico privatecada vez ... gracias de todos modos
structs hereda públicamente por defecto
struct Employee : public Person