기본 패턴
cpp
int count{3};
double rate{0.5};
std::vector<int> values{1, 2, 3};설명
- C++11 이후 중괄호 초기화는 기본 타입, 클래스, 컨테이너를 비교적 일관된 형태로 초기화하는 문법으로 널리 쓰입니다.
- 가장 큰 장점 중 하나는 narrowing conversion을 더 엄격하게 막아 준다는 점입니다. 예를 들어
int x{3.9};는 의도하지 않은 잘림을 경고 없이 넘기지 않게 도와줍니다. ()초기화와{}초기화는 생성자 선택 결과가 달라질 수 있어서, 특히std::vector<int> v(3, 0);와std::vector<int> v{3, 0};의 차이를 알아 두는 것이 중요합니다.- 집합 초기화, 멤버 초기화, 반환값 구성처럼 여러 위치에서 같은 패턴을 쓸 수 있어 코드 스타일을 통일하기 쉽습니다.
- 다만 "중괄호면 무조건 같다"가 아니라, initializer_list 생성자와 충돌하는 예외도 있으므로 실제 타입별 동작을 함께 확인하는 습관이 필요합니다.
짧은 예제
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> a(3, 7);
std::vector<int> b{3, 7};
std::cout << a.size() << " " << b.size() << "\n";
}빠른 정리
| 항목 | 설명 |
|---|---|
T x{...} | 중괄호 기반 초기화 |
| narrowing 방지 | 잘림 가능성이 큰 변환을 더 엄격하게 막음 |
| 컨테이너 초기화 | 원소 목록을 직접 적을 때 자주 사용 |
| 생성자 선택 차이 | ()와 {}가 다른 생성자를 고를 수 있음 |
| 스타일 통일 | 다양한 타입에 비슷한 초기화 형태를 적용 가능 |
주의할 점
std::vector<int> v(10, 1)은 크기 10의 벡터를 만들지만, std::vector<int> v{10, 1}은 원소 두 개 10, 1을 가진 벡터가 됩니다. 비슷해 보여도 의미가 다릅니다.