У мене запитання щодо однієї з функцій c ++ 20, призначених ініціалізаторами (більше інформації про цю функцію тут )
#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}};
}
Цей код був складений з gcc 9.2.0 та -Wall -Wextra -std=gnu++2aпрапорами.
Як ви бачите вище, обидві структури Personі Employeeє агрегатами, але ініціалізація Employeeсукупності неможлива за допомогою призначених ініціалізаторів.
Може хтось мені пояснить, чому?
publicабо privateкожен раз ... все одно дякую
structs успадкувати публічно за замовчуванням
struct Employee : public Person