Mam pytanie dotyczące jednej z funkcji c ++ 20, wyznaczonych inicjatorów (więcej informacji o tej funkcji tutaj )
#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}};
}
Ten kod został skompilowany z gcc 9.2.0 i -Wall -Wextra -std=gnu++2a
flagami.
Jak widać powyżej, obie struktury Person
i Employee
są agregacjami, ale inicjowanie Employee
agregacji nie jest możliwe przy użyciu wyznaczonych inicjatorów.
Czy ktoś mógłby mi wyjaśnić, dlaczego?
c++
aggregate
c++20
designated-initializer
MateuszGierczak
źródło
źródło
struct Employee : public Person
public
lub zaprivate
każdym razem ... dzięki w każdym raziestruct
s domyślnie dziedziczy publicznieOdpowiedzi:
Zgodnie ze standardem C ++ 20 (9.3.1 Aggregates. S. 3)
Dlatego nie można używać wyznaczonej listy inicjalizacyjnej do inicjowania elementów danych klas podstawowych.
Zamiast tego użyj zwykłej inicjalizacji listy, takiej jak
lub
lub jak wskazał @ Jarod42 w komentarzu, który możesz napisać
W tym przypadku bezpośrednia klasa podstawowa jest inicjowana przez wyznaczoną listę inicjalizującą, podczas gdy klasa Employe w całości jest inicjowana przez niewyznaczoną listę inicjalizującą.
źródło
Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };
.Możesz mieć kilka pól o tej samej nazwie z różnych baz,
więc logicznie powinieneś podać nazwę poszukiwanej bazy, ale wygląda na to, że nie ma na to sposobu.
Ponadto inicjalizacja wyznaczona w C ++ jest bardziej ograniczona niż C:
źródło