Какое отличие между std::move и приведением к (T&&)?

330
14 февраля 2017, 19:41

Скажите, в чем разница если написать T&& вместо std::move? Вот код:

template<class T>
void swap(T &a, T& b)
{
    T t{ std::move(a) };
    a = (T &&)(b);
    b = std::move(t);
}

В данном случае так же будет вызван перемещающий оператор = (во всяком случае эффект тот же что и от std::move). Скажите, в чем отличие от варианта строкой ниже с std::move?

Answer 1

Согласно Стандарту языка шаблонная функция std::move(T&& t) возвращает:

static_­cast<remove_­reference_­t<T>&&>(t)

Т.е. пока шаблонная функция имеет T& в сигнатуре - разницы Вы не увидите. Но если функция будет принимать T&& аргумент, то результат уже будет иной:

#include <iostream>
#include <utility>
template<class T>
void fr(T& a) {
    std::cout << "&  " << std::is_same_v<decltype(std::move(a)), decltype((T&&)(a))> << "\n";
}
template<class T>
void frr(T&& a) {
    std::cout << "&& " << std::is_same_v<decltype(std::move(a)), decltype((T&&)(a))> << "\n";
}
int main() {
    int i = 42;
    fr(i);
    frr(i);
}

Вывод:

&  1    
&& 0

Происходит это потому, что для frr тип T выводится как int&, и запись вида T&& превращается в int&&&, что в свою очередь снова даёт int&, а не int&&.

Мой код использует конструкции из c++17, поэтому если нужно, чтобы он собирался в c++11 надо заменить std::is_same_v<T1, T2> на std::is_same<T1, T2>::value.

READ ALSO
Пропуск оператора [дубликат]

Пропуск оператора [дубликат]

На данный вопрос уже ответили:

256
Что значит: &ldquo;virtual void funcC( double = 0.0 );&rdquo;?

Что значит: “virtual void funcC( double = 0.0 );”?

Добрый деньСлучайно наткнулся на функцию у которой непонятно что записано в параметрах:

383
Неразрешенные внешний символы (ImGui)

Неразрешенные внешний символы (ImGui)

Добрый деньПытаюсь внедрить ImGui в свое приложение

407
wcout в WinXP при использовании MinGW w64

wcout в WinXP при использовании MinGW w64

Как вывести не-ASCII текст с помощью std::wcout в Windows XP, если для компиляции используется MinGW w64? Уже посмотрел кучу похожих вопросов, но ничего из этого...

301