Скажите, в чем разница если написать 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
?
Согласно Стандарту языка шаблонная функция 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
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый деньСлучайно наткнулся на функцию у которой непонятно что записано в параметрах:
Как вывести не-ASCII текст с помощью std::wcout в Windows XP, если для компиляции используется MinGW w64? Уже посмотрел кучу похожих вопросов, но ничего из этого...