language_copy_initialization
language_copy_initialization (복사 초기화)
다른 객체로부터 객체를 초기화해요. =을 쓰거나, 값 전달·값 반환처럼 독립적으로 값을 만드는 상황에서 일어나는 초기화 방식이에요.
출처: cppreference
본문
문법
T object = other; // (1)
T object = {other}; // (2) until C++11
f(other) // (3)
return other; // (4)
throw object; //
catch (T object) // (5)
T array[N] = {other-sequence}; // (6)
설명
복사 초기화는 다음 상황에서 수행돼요.
-
- 비-참조 타입
T의 이름 있는 변수(자동·정적·스레드-로컬)를 등호 뒤 표현식으로 구성된 초기화자로 선언할 때.
- 비-참조 타입
-
- (C++11 이전) 스칼라 타입
T의 이름 있는 변수를 등호 뒤 중괄호로 감싼 표현식으로 선언할 때. (C++11부터 이는 리스트 초기화로 분류되고, 좁히기 변환은 허용되지 않아요.)
- (C++11 이전) 스칼라 타입
-
- 함수에 인자를 값으로 전달할 때.
-
- 함수에서 값을 반환할 때.
-
- 예외를 값으로 던지거나 받을 때.
-
- 애그리게이트 초기화의 일부로, 초기화자가 제공된 각 요소를 초기화할 때.
복사 초기화의 효과는 다음과 같아요.
- 먼저,
T가 클래스 타입이고 초기화자가 cv-unqualified 타입이T와 같은 클래스인 prvalue 표현식이면, 그 표현식 자체(구체화된 임시 객체가 아니라)가 목적 객체를 초기화하는 데 쓰여요: 복사 생략(copy elision) 참고. (C++17) - 그 외에도
T가 클래스 타입이고other의 타입의 cv-unqualified 버전이T이거나T에서 파생된 클래스라면,T의 비-explicit 생성자들이 조사되어 오버로드 해석으로 최적 일치를 고르고, 그 생성자가 객체를 초기화해요. - 그 외에
T가 클래스 타입이고other의 타입이T나 파생 타입이 아니거나,T가 비-클래스 타입이면, 아래 (계속) 규칙을 따라요.
복사 초기화는 직접 초기화와 달리 explicit 생성자를 사용할 수 없다는 점이 중요해요. 변환 함수가 필요한 implicit 변환이 이루어질 수 있어요.