language_direct_initialization

language_direct_initialization (직접 초기화)

명시적 생성자 인자 집합으로 객체를 초기화해요. 괄호 ()나 중괄호 {}로 초기화자를 직접 나열하는 방식이에요.

출처: cppreference

본문

문법

T object ( arg );                    // (1)
T object ( arg1, arg2, ... );
T object { arg };                    // (2) since C++11
T ( other )                          // (3)
T ( arg1, arg2, ... )
static_cast< T >( other )            // (4)
new T( args, ... )                   // (5)
Class::Class() : member( args, ... ) { ... }   // (6)
[arg]() { ... }                      // (7) since C++11

설명

직접 초기화는 다음 상황에서 수행돼요.

    1. 비어 있지 않은 괄호로 감싼 표현식 목록 또는 braced-init-list로 초기화 (C++11).
    1. 비-클래스 타입 객체를 중괄호 하나로 감싼 초기화자로 초기화 (클래스 타입과 braced-init-list의 다른 용도는 리스트 초기화 참고, C++11).
    1. 함수 스타일 캐스트 또는 괄호로 감싼 표현식 목록으로 prvalue 임시 객체(C++17 이전)/prvalue의 결과 객체(C++17) 초기화.
    1. static_cast 표현식으로 prvalue 임시 객체(C++17 이전)/prvalue의 결과 객체(C++17) 초기화.
    1. 초기화자가 있는 new-표현식으로 동적 저장 기간 객체 초기화.
    1. 생성자 초기화 목록으로 기반 객체·비-정적 멤버 초기화.
    1. 람다 표현식에서 복사로 포착한 변수들로 클로저 객체 멤버 초기화.

직접 초기화의 효과는 다음과 같아요.

  • T가 배열 타입이면 프로그램은 ill-formed예요. (C++20 이전) 배열은 애그리게이트 초기화처럼 초기화돼요. (C++20)
  • T가 클래스 타입이면, 지정된 인자들에 대해 T의 생성자들이 조사되고 오버로드 해석이 최적 생성자를 선택해 객체를 초기화해요.
  • T가 클래스 타입이 아니면, 소스 타입에서 T로의 표준 변환들이 검토되어 최적 일치를 골라 초기화해요.

직접 초기화는 복사 초기화와 달리 explicit 생성자를 그대로 사용할 수 있어요. T object(other) 형태는 임의 인자 집합을 쓰므로 오버로드 해석으로 생성자를 골라요.

더 알아보기 (Learn more)

cppreference