Страницы

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

суббота, 20 апреля 2019 г.

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

Скажите, в чем разница если написать 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?


Ответ

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

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

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