(C++ : Move Semantics-6) std::move 만들기

Posted by : at

Category : Cpp


#include <iostream>
#include "Test.h"
using namespace std;

int main()
{
  Test t1;
  Test t2 = t1;   // copy
  Test t3 = move(t1);   // 결국 이 동작은 static_cast<Test&&>(t1); 을 대신한다.
  
  // 우리가 xmove()를 따로 만들어보자!
}
// 참조형(&)으로 받아서
template<typename T> T&& xmove(T& obj)
{
    // move로 리턴한다.
    return static_cast<T&&>(obj);
}
// 한번 사용해보자.
int main()
{
  Test t1;
  Test t2 = t1;         // copy
  Test t3 = xmove(t1);  // move
  
  // 그런데? 이런거 까지 다 되게 하고 싶다??
  Test t4 = xmove( Test() );    // 매개변수가 rvalue이기에 rvalue를 받을 수 있게 수정을 해야겠구만...
}
template<typename T> T&& xmove(T&& obj)   // 수정완료!
{
  return static_cast<T&&>(obj);
}
// 다시해보자.
int main()
{
    Test t1;
    Test t2 = t1;                   // copy
    Test t3 = xmove(t1);            // copy -> ??? -> 왜 여기서 copy가 되지?
    Test t4 = xmove( Test() );      // move
}
// 인자로 lvalue 전달 : T => Test&, T&& => Test& && => Test& 되기에 copy
// 인자로 rvalue 전달 : T => Test, T && => Test&& 되기에 move
template<typename T> T&& xmove(T&& obj)
{
    // 목표 rvalue로 캐스팅!
    return static_cast<T&&>(obj);

    return static_cast<remove_reference<T>::type &&>(obj); 
    // 이렇게 하면된다. -> 말 그대로 레퍼런스를 제거해 달라는명령
    // 리턴도 바꿔야 하기에(아래참조)
}
template<typename T>
typename remove_reference<T>::type && xmove(T&& obj)
{
    return static_cast<remove_reference<T>::type &&>(obj);
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links