2011-09-22 22 views
5

最新のC++標準に追加された新しい関数std :: move()についてちょっと不思議です。それについての記事を読み終え型キャストとstd :: move()の違いは?

と関数の定義が

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

であることが判明し、それは::動きをSTDを呼び出し、キャストを使用しての間に違いはありませんようにこれがそうです。

ここで例えば

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は機能面で何もしません。その目的は左辺値をxvalueに変換することで結果を移動可能にします。目的が明確になるので、キャストを使用するよりも優れています。

+0

ありがとう!私はstd :: moveを使用します! –

5

機能に違いはありませんが、読みやすさに違いがあります。 whileループがgotoのに好適であり、C++スタイルのキャストは、Cスタイルにキャスト好ましいが、それは少ない一般的なツールであり、それが何であるかを理解することが容易であるため、std::moveが鋳造に好適であるのと同じように

これ以上コードの構造を調べる必要はありません。

+0

ありがとうございます!それは有り難いです。 –

関連する問題