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
설명
직접 초기화는 다음 상황에서 수행돼요.
-
- 비어 있지 않은 괄호로 감싼 표현식 목록 또는 braced-init-list로 초기화 (C++11).
-
- 비-클래스 타입 객체를 중괄호 하나로 감싼 초기화자로 초기화 (클래스 타입과 braced-init-list의 다른 용도는 리스트 초기화 참고, C++11).
-
- 함수 스타일 캐스트 또는 괄호로 감싼 표현식 목록으로 prvalue 임시 객체(C++17 이전)/prvalue의 결과 객체(C++17) 초기화.
-
static_cast표현식으로 prvalue 임시 객체(C++17 이전)/prvalue의 결과 객체(C++17) 초기화.
-
- 초기화자가 있는
new-표현식으로 동적 저장 기간 객체 초기화.
- 초기화자가 있는
-
- 생성자 초기화 목록으로 기반 객체·비-정적 멤버 초기화.
-
- 람다 표현식에서 복사로 포착한 변수들로 클로저 객체 멤버 초기화.
직접 초기화의 효과는 다음과 같아요.
T가 배열 타입이면 프로그램은 ill-formed예요. (C++20 이전) 배열은 애그리게이트 초기화처럼 초기화돼요. (C++20)T가 클래스 타입이면, 지정된 인자들에 대해T의 생성자들이 조사되고 오버로드 해석이 최적 생성자를 선택해 객체를 초기화해요.T가 클래스 타입이 아니면, 소스 타입에서T로의 표준 변환들이 검토되어 최적 일치를 골라 초기화해요.
직접 초기화는 복사 초기화와 달리 explicit 생성자를 그대로 사용할 수 있어요. T object(other) 형태는 임의 인자 집합을 쓰므로 오버로드 해석으로 생성자를 골라요.