move semantics

std::move 캐스팅

lvalue, rvalue, xvalue, prvalue, &&, std::forward는 복사 대신 이동을 선택하는 문맥을 만듭니다.

lvalue

함수 객체 재사용성

주소를 취할 수 있는 변수는 보통 lvalue로 다룹니다.

rvalue 참조

rvalue 참조 역할

호출자가 더는 쓰지 않을 값을 넘긴다는 이동 의도를 매개변수 타입에서 드러냅니다.

std::move

std::move 표시 의미

실제 이동은 이동 생성자나 이동 대입에서 일어납니다.

std::forward

value category 보존

템플릿 래퍼가 lvalue와 rvalue를 구분해 넘길 때 필요합니다.

소유권 이동 후 원본은 유효하지만 값은 지정되지 않은 상태일 수 있습니다.
성능 큰 버퍼나 문자열은 복사보다 포인터 교환이 훨씬 싸게 끝납니다.
이동 후 상태 std::move 뒤 원본을 다시 읽을 때는 재초기화 여부를 분명히 합니다.