Başlatıcılar olarak belirlenmiş c ++ 20 özelliğinden biriyle ilgili bir sorum var (bu özellik hakkında daha fazla bilgi burada )
#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}};
}
Bu kod gcc 9.2.0 ve -Wall -Wextra -std=gnu++2a
bayraklarla derlenmiştir .
Eğer, yukarıya bakın hem yapılar, gibi Person
ve Employee
agrega ama başlatma olan Employee
agrega belirlenmiş başlatıcıları kullanılarak mümkün değildir.
Birisi bana nedenini açıklayabilir mi?
public
veya private
her seferinde kullanıyorum ... teşekkürler yine de
struct
s varsayılan olarak herkese açık olarak devralınır
struct Employee : public Person