5

最新のC++標準に追加されたばかりの新しい関数std::move()について少し興味があります。

それについての記事を読み終えて、関数の定義が

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

これは、std::moveの呼び出しとキャストの使用に違いがないようです。

たとえば、ここでは、

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;
}

基本的に違いはないと考えるのは正しいですか?まあ、私は自分が正しいと確信していますが、自信がありすぎると常に裏目に出ることも知っています。

前もって感謝します!

4

3 に答える 3

9

std::move特殊なキャストとして定義されています:

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

本当に必要な場合は、これを行うことができます。しかし、を使用するだけで、何をしているのかがはるかに短く、誰にとっても明白になりますstd::move。&&キャストに関するルールは奇妙なので、そのまま使用するのが最善でmoveありforward、それが意味する場合です。

于 2011-09-22T02:59:20.487 に答える
5

機能性に違いはありませんが、読みやすさに違いがあります。

whileループがgotosよりも優先され、C ++スタイルのキャストがCスタイルのキャストよりも優先されるのと同様に、一般的ではないstd::moveツールであるためキャストよりも優先されるため、コードの構造を調査しなくても、ループが何をしているのかを理解しやすくなります。それ以上。

于 2011-09-22T03:01:22.253 に答える
2

はい、std::move機能面では何もしません。その目的は、左辺値をx値に変換し、結果を移動可能にすることです。目的が明確になるため、キャストを使用するよりも優れています。

于 2011-09-22T03:00:39.897 に答える