семантика перемещения std :: move - PullRequest
12 голосов
/ 03 апреля 2011

Я не очень хорошо понимаю функцию std::move

template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}

почему remove_reference?Может ли кто-нибудь дать мне простое объяснение?

Ответы [ 2 ]

17 голосов
/ 03 апреля 2011

Подумайте, что произойдет, если T является ссылкой на lvalue, например MyClass &. В этом случае T && станет MyClass & &&, и из-за правил свертывания ссылок это будет преобразовано в MyClass & снова. Чтобы получить правильный результат, typename remove_reference<MyClass&>::type&& сначала удаляет любые ссылочные декорации из типа, поэтому MyClass & сопоставляется с MyClass, а затем к нему применяется ссылка rvalue, в результате получается MyClass &&.

7 голосов
/ 03 апреля 2011

Поскольку ссылка rvalue на ссылку lvalue может превратиться в ссылку lvalue, а получение ссылки lvalue будет иметь семантику, отличную от той, которую вы ожидаете от move.

Редактировать: Да, почему понизился голос?Проверьте этот код:

template < typename T > T&& func(T&& x) { return x; }

int main()
{
        int x;

        int &y = func(x);
}

Дополнительная информация: http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html

...