Страницы

Поиск по вопросам

понедельник, 10 февраля 2020 г.

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

#cpp #cpp11


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

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


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


Ответы

Ответ 1



Согласно Стандарту языка шаблонная функция std::move(T&& t) возвращает: static_­cast&&>(t) Т.е. пока шаблонная функция имеет T& в сигнатуре - разницы Вы не увидите. Но если функция будет принимать T&& аргумент, то результат уже будет иной: #include #include template void fr(T& a) { std::cout << "& " << std::is_same_v << "\n"; } template void frr(T&& a) { std::cout << "&& " << std::is_same_v << "\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 на std::is_same::value.

Комментариев нет:

Отправить комментарий