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)

설명

복사 초기화는 다음 상황에서 수행돼요.

    1. 비-참조 타입 T의 이름 있는 변수(자동·정적·스레드-로컬)를 등호 뒤 표현식으로 구성된 초기화자로 선언할 때.
    1. (C++11 이전) 스칼라 타입 T의 이름 있는 변수를 등호 뒤 중괄호로 감싼 표현식으로 선언할 때. (C++11부터 이는 리스트 초기화로 분류되고, 좁히기 변환은 허용되지 않아요.)
    1. 함수에 인자를 값으로 전달할 때.
    1. 함수에서 값을 반환할 때.
    1. 예외를 값으로 던지거나 받을 때.
    1. 애그리게이트 초기화의 일부로, 초기화자가 제공된 각 요소를 초기화할 때.

복사 초기화의 효과는 다음과 같아요.

  • 먼저, T가 클래스 타입이고 초기화자가 cv-unqualified 타입이 T와 같은 클래스인 prvalue 표현식이면, 그 표현식 자체(구체화된 임시 객체가 아니라)가 목적 객체를 초기화하는 데 쓰여요: 복사 생략(copy elision) 참고. (C++17)
  • 그 외에도 T가 클래스 타입이고 other의 타입의 cv-unqualified 버전이 T이거나 T에서 파생된 클래스라면, T의 비-explicit 생성자들이 조사되어 오버로드 해석으로 최적 일치를 고르고, 그 생성자가 객체를 초기화해요.
  • 그 외에 T가 클래스 타입이고 other의 타입이 T나 파생 타입이 아니거나, T가 비-클래스 타입이면, 아래 (계속) 규칙을 따라요.

복사 초기화는 직접 초기화와 달리 explicit 생성자를 사용할 수 없다는 점이 중요해요. 변환 함수가 필요한 implicit 변환이 이루어질 수 있어요.

더 알아보기 (Learn more)

cppreference