move_constructor — 이동 생성자
move_constructor — 이동 생성자
**이동 생성자(move constructor)**는 같은 클래스 타입의 rvalue 인자로 호출될 수 있는 생성자로, 인자의 자원을 최적화된 방식으로 "이동"해요. C++11에서 도입됐어요.
복사 생성자가 깊은 복사를 한다면, 이동 생성자는 원본의 자원을 훔쳐오고 원본은 유효하지만 비워진(valid but unspecified) 상태로 남겨요. 포인터를 옮기는 것만으로 끝나서 복사보다 훨씬 효율적이에요.
출처: cppreference
본문
이동 생성자는 같은 클래스 타입의 rvalue 인자로 호출될 수 있는 생성자로, 인자를 수정하지 않고 인자의 내용을 이동해요.
문법 (Syntax)
class-name ( parameter-list ) ;
class-name ( parameter-list ) function-body
class-name ( single-rvalue-reference-parameter-list ) = default;
class-name ( parameter-list ) = delete;
class-name :: class-name ( parameter-list ) function-body
class-name :: class-name ( single-rvalue-reference-parameter-list ) = default;
class-name— 이동 생성자를 선언하는 클래스 (클래스 타입을T라 함)parameter-list— 비어 있지 않은 매개변수 목록으로, 첫 매개변수가T&&,const T&&,volatile T&&,const volatile T&&이고 나머지는 모두 기본 인자function-body— 이동 생성자의 함수 본문
설명 (Explanation)
이동 생성자는 보통 같은 타입의 rvalue 객체로부터 객체를 초기화할 때 호출돼요 (과부하 해석이 더 나은 매치를 선택하거나 복사 생략되면 제외). rvalue 초기화자는 일시적인 객체나 std::move로 이동된 lvalue를 포함해요.
암시적으로 선언된 이동 생성자
클래스 타입에 사용자 선언 이동 생성자가 없으면, 다음 조건을 모두 만족할 때 컴파일러가 이동 생성자를 선언해요.
- 사용자 선언 복사 생성자가 없음
- 사용자 선언 복사 대입, 이동 대입, 소멸자가 없음
암시적으로 정의된 이동 생성자
암시적으로 선언된 이동 생성자가 삭제되지 않았다면, ODR-사용되거나 상수 평가에 필요할 때 컴파일러가 정의해요. 멤버별로 이동을 수행해요 — 기반과 비정적 멤버를 각각의 이동 생성자(있으면)로 이동하고, 이동 생성자가 없으면 복사해요.
삭제된 이동 생성자
암시적으로 선언되거나 명시적으로 default 처리된 이동 생성자는, 삭제되거나 접근 불가한 소멸자를 가진 부분 객체를 가질 때 등 특정 조건에서 삭제된 것으로 정의돼요.
Trivial 이동 생성자
다음이 모두 참이면 trivial이에요. 사용자가 제공하지 않고, 가상 멤버·가상 기반이 없고, 각 기반과 멤버의 이동/복사 생성자가 trivial인 경우예요.
노트 (Notes)
rhs 인자를 const lvalue 참조가 아니라 rvalue 참조로 받기 때문에, 값에 의한 임시 이동을 효율적으로 수행할 수 있어요. 이동 생성자를 명시적으로 삭제하면 복사 생성자만 사용돼요.