วิธีที่ง่ายที่สุดคือไม่ให้ชนิดของสมาชิกเป็นตัวสร้างแบบไม่มีอาร์กิวเมนต์:
struct B
{
B(int x) {}
};
struct A
{
B a;
B b;
B c;
};
int main() {
// A a1{ 1, 2 }; // will not compile
A a1{ 1, 2, 3 }; // will compile
ตัวเลือกอื่น: หากสมาชิกของคุณเป็นกลุ่ม & คุณต้องเริ่มต้นทั้งหมด:
struct A { const int& x; const int& y; const int& z; };
int main() {
//A a1{ 1,2 }; // will not compile
A a2{ 1,2, 3 }; // compiles OK
หากคุณสามารถใช้ชีวิตอยู่กับสมาชิกตัวน้อยหนึ่งคนและสมาชิกคุณสามารถรวมเข้ากับแนวคิดของ @ max66 เกี่ยวกับ Sentinel
struct end_of_init_list {};
struct A {
int x;
int y;
int z;
const end_of_init_list& dummy;
};
int main() {
//A a1{ 1,2 }; // will not compile
//A a2{ 1,2, 3 }; // will not compile
A a3{ 1,2, 3,end_of_init_list() }; // will compile
จาก cppreference https://en.cppreference.com/w/cpp/language/aggregate_initialization
ถ้าจำนวนของ initializer clases น้อยกว่าจำนวนสมาชิกหรือรายการ initializer ว่างเปล่าทั้งหมดสมาชิกที่เหลือจะถูกกำหนดค่าเริ่มต้น ถ้าสมาชิกของประเภทการอ้างอิงเป็นหนึ่งในสมาชิกที่เหลือเหล่านี้โปรแกรมจะไม่ถูกต้อง
อีกทางเลือกหนึ่งคือใช้แนวคิดของ Sentinel ของ Max66 และเพิ่มน้ำตาล syntactic เพื่อให้อ่านง่าย
struct init_list_guard
{
struct ender {
} static const end;
init_list_guard() = delete;
init_list_guard(ender e){ }
};
struct A
{
char a;
char b;
char c;
init_list_guard guard;
};
int main() {
// A a1{ 1, 2 }; // will not compile
// A a2{ 1, init_list_guard::end }; // will not compile
A a3{ 1,2,3,init_list_guard::end }; // compiles OK