콘텐츠로 이동

지정 초기화 (Designated Initializers)

지정된 초기화 프로그램은 C++20 호환 형식으로만 사용하세요.

지정된 초기화는 해당 필드의 이름을 명시적으로 지정하여 집계("일반 이전 구조체")를 초기화할 수 있는 구문입니다.

  struct Point {
    float x = 0.0;
    float y = 0.0;
    float z = 0.0;
  };

  Point p = {
    .x = 1.0,
    .y = 2.0,
    // z will be 0.0
  };

명시적으로 나열된 필드는 지정된 대로 초기화되고 다른 필드는 Point{1.0, 2.0} 과 같은 기존 집계 초기화 표현식과 동일한 방식으로 초기화됩니다.

지정된 이니셜라이저는 특히 위의 Point 예제보다 필드 순서가 덜 간단한 구조체의 경우 편리하고 읽기 쉬운 집계 표현식을 만들 수 있습니다.

지정된 이니셜라이저는 오랫동안 C 표준의 일부였으며 C++ 컴파일러에서 확장으로 지원되었지만 C++20 이전에는 C++에서 지원되지 않았습니다.

C++ 표준의 규칙은 C 및 컴파일러 확장보다 더 엄격하여 지정된 이니셜라이저가 구조체 정의에 나타나는 필드와 동일한 순서로 나타나도록 요구합니다. 따라서 위의 예에서 C++20에 따르면 x를 초기화한 다음 z를 초기화하는 것은 허용되지만 y를 초기화한 다음 x를 초기화하는 것은 허용되지 않습니다.

지정된 이니셜라이저는 C++20 표준과 호환되는 형식으로만 사용하세요. 구조체 정의에 나타나는 해당 필드와 동일한 순서로 이니셜라이저를 사용하세요.


이해하기 쉽게 설명하기

핵심: C++20 호환 형식으로만 사용

지정 초기화는 집계(aggregate, "plain old struct")를 필드 이름으로 초기화하는 구문입니다.

struct Point { float x = 0.0; float y = 0.0; float z = 0.0; };

Point p = {
  .x = 1.0,
  .y = 2.0,
  // z는 0.0
};

주의: 선언 순서를 지켜야 함

C++20의 규칙은 C나 컴파일러 확장보다 엄격해서, 지정 초기화자가 구조체 정의에 나타난 필드 순서와 같은 순서여야 합니다. 위 예에서 x 다음 z는 되지만, y 다음 x는 안 됩니다. C 스타일의 임의 순서 지정 초기화는 쓰지 마세요.