지정 초기화 (Designated Initializers)¶
지정 초기화자는 C++20에 부합하는 형태로만 사용하세요.
정의:
지정 초기화자는 집합체(aggregate, 이른바 "평범한 구조체")를 그 필드 이름을 명시해서 초기화할 수 있게 해 주는 문법입니다.
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이 됩니다
};
명시적으로 나열한 필드는 지정한 대로 초기화되고, 나머지 필드는 Point{1.0, 2.0} 같은 전통적인 집합체 초기화 표현식에서와 똑같은 방식으로 초기화됩니다.
장점:
지정 초기화자는 편리하고 아주 읽기 좋은 집합체 표현식을 만들어 줍니다. 위의 Point 예제보다 필드 순서가 덜 자명한 구조체에서는 특히 그렇습니다.
단점:
지정 초기화자는 오랫동안 C 표준의 일부였고 C++ 컴파일러들도 확장으로 지원해 왔지만, C++20 이전의 C++에서는 지원되지 않았습니다.
C++ 표준의 규칙은 C나 컴파일러 확장보다 엄격해서, 지정 초기화자가 구조체 정의에 필드가 나타나는 순서와 같은 순서로 등장하기를 요구합니다. 그래서 위 예에서 x를 초기화한 다음 z를 초기화하는 것은 C++20에서 적법하지만, 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 스타일의 임의 순서 지정 초기화는 쓰지 마세요.