Saya punya pertanyaan tentang salah satu fitur c ++ 20, inisialisasi yang ditunjuk (info lebih lanjut tentang fitur ini di sini )
#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}};
}
Kode ini dikompilasi dengan gcc 9.2.0 dan -Wall -Wextra -std=gnu++2a
flag.
Seperti yang Anda lihat di atas, kedua struct, Person
dan Employee
merupakan agregat tetapi inisialisasi Employee
agregat tidak mungkin menggunakan inisialisasi yang ditunjuk.
Bisakah seseorang menjelaskan mengapa?
c++
aggregate
c++20
designated-initializer
MateuszGierczak
sumber
sumber
struct Employee : public Person
public
atauprivate
setiap waktu ... terima kasihstruct
mewarisi ke publik secara defaultJawaban:
Menurut Standar C ++ 20 (Agregat 9.3.1. Hal. 3)
Jadi Anda tidak boleh menggunakan daftar penginisialisasi yang ditunjuk untuk menginisialisasi data anggota kelas dasar.
Gunakan inisialisasi daftar biasa seperti
atau
atau seperti yang ditunjukkan @ Jarod42 dalam komentar yang dapat Anda tulis
Dalam hal ini, kelas dasar langsung diinisialisasi dengan daftar penginisialisasi yang ditunjuk sementara kelas Karyawan secara keseluruhan diinisialisasi oleh daftar penginisialisasi yang tidak ditunjuk.
sumber
Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };
.Anda mungkin memiliki beberapa bidang dengan nama yang sama dari pangkalan yang berbeda,
jadi secara logis, Anda harus memberikan nama pangkalan yang diinginkan, tetapi tampaknya tidak ada cara untuk melakukannya.
Selain itu inisialisasi C ++ yang ditunjuk lebih dibatasi daripada C:
sumber