move 함수
std::move 함수는 이동을 수행하지 않음. 그냥 인자로 받은 객체를 우측값으로 변환할 뿐임.
--> 즉, 타입 변환만 수행
#include <iostream>
#include <utility>
class A {
public:
A() { std::cout << "일반 생성자 호출!" << std::endl; }
A(const A& a) { std::cout << "복사 생성자 호출!" << std::endl; }
A(A&& a) { std::cout << "이동 생성자 호출!" << std::endl; }
};
int main() {
// 일반 생성자 호출
A a;
// 복사 생성자 호출
// b(a)했을 때 a가 좌측값이므로 좌측값 레퍼런스 참조하기 때문
std::cout << "---------" << std::endl;
A b(a);
// 이동 생성자 호출
// std::move 함수가 인자로 받은 객체를 우측값으로 변환해서 리턴해주기 때문.
std::cout << "---------" << std::endl;
A c(std::move(a));
}

cpp의 템플릿
이 때, std::forward<T>(u) 사용!
참고 :
C++ 컴파일러가 템플릿 타입을 추론할 때, 템플릿 인자 T 가 레퍼런스가 아닌 일반적인 타입이라면 const 를 무시함
#include <iostream>
template<class T>
void print(T& n) {
std::cout << "l-value" << std::endl;
}
template<class T>
void print(const T& n) {
std::cout << "r-value" << std::endl;
}
template<class T>
void fnc(T&& n) {
print(std::forward<T>(n));
}
int main() {
int n = 10;
fnc(n); // lvalue
fnc("hwan"); // rvalue
fnc(1.123); // rvalue
return 1;
}
출처 : https://hwan-shell.tistory.com/250
보편적 레퍼런스
#include <iostream>
// T&& 보편적 레퍼런스 forward 함수
template <typename T>
void wrapper(T&& u) {
g(std::forward<T>(u));
}
class A {};
void g(A& a) { std::cout << "좌측값 레퍼런스 호출" << std::endl; }
void g(const A& a) { std::cout << "좌측값 상수 레퍼런스 호출" << std::endl; }
void g(A&& a) { std::cout << "우측값 레퍼런스 호출" << std::endl; }
int main() {
A a;
const A ca;
std::cout << "원본 --------" << std::endl;
g(a);
g(ca);
g(A());
std::cout << "Wrapper -----" << std::endl;
wrapper(a);
wrapper(ca);
wrapper(A());
}
