2011-09-22 3 views
5

새로운 C++ 표준에 방금 추가 된 새로운 함수 std :: move()에 대해 궁금합니다. 타입 캐스팅과 std :: move() 사용의 차이점은 무엇입니까?

은 대한 기사를 읽고 완료하고 함수의 정의는

namespace std { 
     template <class T> 
     inline typename remove_reference<T>::type&& move(T&& x) 
     { 
      return x; 
     } 
} 

입니다 그것은 표준 : : 이동 전화 및 주조를 사용하는 사이에 차이가없는 것처럼이 보이는 것을 발견했다.

여기 예를 들어

,

class NPC{ 
    int m_number1; 
    int m_number2; 
public: 
    NPC() : m_number1(1), m_number2(2) { 
     cout << "NPC Constructor called!" << endl; 
    } 

    NPC(NPC&& _npc) : m_number1(_npc.m_number1), m_number2(_npc.m_number2) { 
     _npc.m_number1 = 0; 
     _npc.m_number2 = 0; 

     cout << "NPC Move Constructor called!" << endl; 
    } 
}; 


int main() { 
    NPC n1; 
    NPC n2 = std::move(n1); 

    cout << "----------------" << endl; 
    NPC n3; 
    NPC n4 = (NPC&&)n3; 
    return 0; 
} 

은 바로 기본적으로 차이가 없다고 생각인가? 글쎄, 나는 내가 옳다는 것을 확신하지만 항상 자신감이 항상 역효과를 낸다는 것도 알고있다.

미리 감사드립니다.

답변

9

std::move는 전문 캐스트로 정의된다 :

static_cast<typename remove_reference<T>::type&&>(t) 

당신이 정말로 원하는 경우가 이 작업을 수행 할 수 있습니다. 그러나 당신이 단지 std::move을 사용한다면 당신이하고있는 일은 훨씬 더 짧고 명백 할 것입니다. & & 캐스팅에 관한 규칙은 이상합니다. 따라서 moveforward을 사용하는 것이 가장 좋습니다.

+0

고마워요! 이것은 나를 많이 돕는다! –

2

예, std::move은 기능면에서 아무런 역할을하지 않습니다. 그 목적은 lvalue를 xvalue로 변환하여 결과를 이동 가능하게 만듭니다. 목적을 분명하게하기 때문에 캐스트를 사용하는 것보다 낫습니다.

+0

감사! 나는 std :: move를 사용할 것이다! –

5

기능상의 차이는 없지만 가독성에는 차이가 있습니다.

그냥 while 같은 루프는 goto들에 바람직하고, 그것이 일반적인 도구이기 때문에 C++ 스타일의 캐스트는 std::move 캐스팅 선호된다 캐스트 C 스타일에 바람직하고, 그래서 그것이 무엇인지 이해하기 쉽다 코드의 구조를 더 이상 조사하지 않아도됩니다.

+0

감사합니다! 감사합니다 –

관련 문제