#cpp #cpp11
Скажите, в чем разница если написать T&& вместо std::move? Вот код: templatevoid 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.
Комментариев нет:
Отправить комментарий