Разница между приведением типов и использованием std :: move ()? - PullRequest
5 голосов
/ 22 сентября 2011

Мне просто интересно узнать о новой функции std :: move (), которая была только что добавлена ​​в новейший стандарт C ++.

Закончил читать статью об этом и обнаружил, что определение функции

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

Правильно ли думать, что в принципе нет разницы? Ну, я почти уверен, что я прав, но я также знаю, что слишком уверенная в себе всегда имеет неприятные последствия.

Заранее спасибо!

Ответы [ 3 ]

9 голосов
/ 22 сентября 2011

std::move определяется как специализированное приведение:

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

Вы можете сделать это, если вы действительно хотите.Но всем было бы намного короче и очевидно, что вы делаете, если вы просто используете std::move.Правила вокруг && casting странные, поэтому лучше всего использовать move и forward, когда вы это имеете в виду.

5 голосов
/ 22 сентября 2011

Нет различий в функциональности, но есть различие в удобочитаемости.

Так же, как циклы while предпочтительнее, чем goto s, так и приведение стилей в C ++ предпочтительнее приведений в стиле C,1005 * предпочтительнее приведения, потому что это менее общий инструмент, и поэтому легче понять, что он делает, без необходимости дальнейшего изучения структуры кода.

2 голосов
/ 22 сентября 2011

Да, std::move ничего не делает в плане функциональности.Его цель - преобразовать lvalue в xvalue, что делает результат подвижным.Это лучше, чем использование приведения, потому что это проясняет цель.

...