가장 간단한 방법은 멤버 유형에 인수 없음 생성자를 제공하지 않는 것입니다.
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
다른 옵션 : 멤버가 const & 인 경우 모든 멤버를 초기화해야합니다.
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
하나의 더미 const & member와 함께 살 수 있다면 @ max66의 센티넬 아이디어와 결합 할 수 있습니다.
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에서
이니셜 라이저 절 수가 멤버 수보다 적거나 이니셜 라이저 목록이 완전히 비어있는 경우 나머지 멤버는 값으로 초기화됩니다. 참조 유형의 구성원이 나머지 구성원 중 하나 인 경우 프로그램이 잘못 구성됩니다.
또 다른 옵션은 max66의 센티넬 아이디어를 취하고 가독성을 위해 구문 설탕을 추가하는 것입니다.
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