Ich habe eine Frage zu einer der C ++ 20-Funktionen, die als Initialisierer bezeichnet werden (weitere Informationen zu dieser Funktion hier ).
#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}};
}
Dieser Code wurde mit gcc 9.2.0 und -Wall -Wextra -std=gnu++2a
Flags kompiliert .
Wie Sie oben sehen können, sind beide Strukturen Person
und Employee
Aggregate, aber die Initialisierung des Employee
Aggregats ist mit bestimmten Initialisierern nicht möglich.
Könnte mir jemand erklären warum?
public
oder private
jedes Mal ... trotzdem danke
struct
s erben standardmäßig öffentlich
struct Employee : public Person