이전 Braced-Init-List(Aggregate Initialization) 와 Initializer_list 이후, struct 와 class 의 public 멤버 변수에 대한 목록 초기화가 가능 했다. ( class 는 생성자가 생성되어 있다면, 목록 초기화가 가능 ) 하지만 초기화 되어야 하는 멤버가 길어질 경우, 각 각의 인자가 어느 변수에 대응되는지를 확인할 수 없었고 특정 멤버 변수만 초기화 하는 것이 불가능 했다. C++20 의 Designated Initializer 가 추가된 이후 가능해졌다. C++11 Initializer_list : https://openmynotepad.tistory.com/14
![]() 이전 Braced-Init-List로 초기화 |
특정 변수만 초기화 할 수 있으며, 어떤 변수를 초기화 할 것인지 명확해진다.
유의할 점은, 특정 변수를 '생략' 할 순 있지만, 지정자를 명시하는 순서는 구조체(클래스) 내에서 선언된 변수의 순서와 동일하여야 한다.
또한, 지정자를 쓸 것이면 모든 인자로 지정자를 작성해야 하며, 지정자를 중첩하여 변수를 초기화 하는 것도 불가능
만약 하고싶다면 새로운 Init-List를 추가하여야 함.
C++17에서 추가된 std::is_aggregate_v<T> 를 통하여, 실제 User-Defined-Type 이 aggregate 한지 확인할 수 있다.
C++20부터 Aggregate 사양이 변경되었다. ( 사용자가 선언한 생성자로 집계 금지 참조 )
다음 코드는 Visual Studio 2017에서는 문제 없이 컴파일 되지만, 2019 Latest 에서는 에러를 발생시킨다.
Aggregate 유형은 다음과 같다.
1. private or protected 된 비 정적 데이터 멤버 없음 ( C++11 까지 )
2. 사용자가 선언한 생성자가 없음 ( C++11 부터 C++17 까지 )
3. 사용자가 제공, 상속 또는 명시적 생성자가 없음 ( 명시적으로 default 또는 delete 된 생성자는 허용, C++20 까지 )
4. 사용자가 선언하거나 상속된 생성자가 없음 ( C++20 이후 )
5. no virtual, private, or protected base 클래스
6. no virtual member function
'C++ > Modern' 카테고리의 다른 글
C++20) Coroutine ( 코루틴 ) - 2 (0) | 2020.08.21 |
---|---|
C++20) Coroutine ( 코루틴 ) - 1 (0) | 2020.08.20 |
C++17) std::variant (0) | 2019.02.28 |
C++17) std::any (0) | 2019.02.27 |
C++17) std::optional (0) | 2019.02.27 |