본문으로 바로가기

C++20) Designated Initializer ( 지정된 초기화 )

category C++/Modern 2020. 8. 19. 23:59
이전 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로 초기화

 

특정 변수만 초기화 할 수 있으며, 어떤 변수를 초기화 할 것인지 명확해진다.

유의할 점은, 특정 변수를 '생략' 할 순 있지만, 지정자를 명시하는 순서는 구조체(클래스) 내에서 선언된 변수의 순서와 동일하여야 한다.

 

x가 y보다 앞에서 선언됐기 때문에, V4 는 에러

또한, 지정자를 쓸 것이면 모든 인자로 지정자를 작성해야 하며, 지정자를 중첩하여 변수를 초기화 하는 것도 불가능

만약 하고싶다면 새로운 Init-List를 추가하여야 함.

 

struct 내의 struct 변수에 중첩된 지정자를 사용하는 것은 에러

C++17에서 추가된 std::is_aggregate_v<T> 를 통하여, 실제 User-Defined-Type 이 aggregate 한지 확인할 수 있다.

 

NAVector3는 생성자가 있으므로, Non-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