C++시작과 문법

brace 초기화와 uniform initialization

중괄호 초기화의 기본 의미와 narrowing 방지, 생성자 선택에 미치는 영향을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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을 가진 벡터가 됩니다. 비슷해 보여도 의미가 다릅니다.