У меня есть вопрос об одной из функций 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
flags.
Как вы можете видеть выше, как структуры, так Person
иEmployee
агрегаты, но инициализация Employee
агрегата невозможна с использованием назначенных инициализаторов.
Может ли кто-нибудь объяснить мне, почему?
c++
aggregate
c++20
designated-initializer
MateuszGierczak
источник
источник
struct Employee : public Person
public
илиprivate
каждый раз ... спасибо, в любом случаеstruct
s наследуется публично по умолчаниюОтветы:
Согласно стандарту C ++ 20 (9.3.1 Агрегаты. Стр. # 3)
Поэтому вы не можете использовать назначенный список инициализаторов для инициализации членов данных базовых классов.
Вместо этого используйте обычную инициализацию списка
или
или как @ Jarod42 указал в комментарии, которые вы можете написать
В этом случае прямой базовый класс инициализируется указанным списком инициализаторов, а класс Employe в целом инициализируется неназначенным списком инициализаторов.
источник
Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };
.Вы можете иметь несколько полей с одинаковыми именами из разных баз,
логично, вы должны указать имя нужной базы, но, похоже, нет способа сделать это.
Кроме того, в C ++ обозначенная инициализация более ограничена, чем в C:
источник