본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Modern C++ : designated initializers (20)

by snowoods 2025. 8. 4.

Modern C++

지정 이니셜라이저 : designated initializers

 

개요

C++20부터 구조체와 배열 등에 지정 이니셜라이저를 사용하여 멤버 이름을 명시적으로 지정해 초기화할 수 있습니다.
이를 통해 멤버 순서와 관계없이 원하는 멤버만 선택적으로 초기화할 수 있으며, 지정하지 않은 멤버는 기본값으로 초기화됩니다.

 

C++ 버전별 주요 키워드 도입 시기

  • C++20: P1008R1 제안에 따라 지정 이니셜라이저 도입

 

내용 설명

  1. 구조체, 배열, 클래스 애그리게이트에 사용 가능
  2. .멤버 = 값 형식으로 초기화하며, 초기화 순서와 정의 순서는 무관
  3. 지정하지 않은 멤버는 기본값(0 또는 디폴트 생성자)으로 초기화
  4. 동일 멤버를 중복 지정 시 컴파일 에러 발생

 

예제 코드

#include <cstdint>
#include <iostream>

struct User { 
    enum class Status { Connected, Disconnected } status;
    std::uint64_t id;
};

int main() {
    User user = {.status = User::Status::Connected, .id = 42U};

    std::cout << "user.status = " << static_cast<int>(user.status) << "\n";
    std::cout << "user.id     = " << user.id << "\n";


    /* C++에서는 아직 안된다.
    // C 스타일 지정 초기화 (GCC/Clang 확장, C++23 표준에도 일부 지원)
    int arr[8] = { [2] = 100,   // 인덱스 2에 100 설정
                   [5] = 200 }; // 인덱스 5에 200 설정
    // 나머지 요소는 0으로 초기화됨
    */

    int arr[8] = { 0, 0, 100 }; 
    // arr[0]=0, arr[1]=0, arr[2]=100,
    // 나머지 요소는 자동으로 0

    std::cout << "arr = {";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << (i + 1 < 5 ? ", " : "");
    }
    std::cout << "}\n";

    return 0;
}

 

실행 결과

user.status = 0
user.id     = 42
arr = {0, 0, 10, 0, 20}

 

활용팁

  • 구조체 초기화 시 실수로 순서를 섞는 실수를 방지할 수 있습니다.
  • 배열에서 특정 인덱스만 초기화할 때 유용하며, 대규모 초기화 코드의 가독성을 높입니다.
  • 기본 생성자나 디폴트 멤버 초기화를 이용한 복잡한 애그리게이트 초기화에도 활용 가능합니다.

 

 

'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글

Modern C++ : enum concepts (11, 20)  (1) 2025.08.03
Modern C++ : enum vs enum class (98, 11)  (1) 2025.08.02
Modern C++ 둘러보기  (3) 2025.08.01