Вы правы, перемещение int
ничем не отличается от его копирования.
Здесь std::move
становится полезным, только если перегруженная T
operator+
ведет себя по-разному для lvalues и rvalues.
Я никогда не слышал о таких классах, но, полагаю, это может быть полезно для динамических c массивов, которые перегружают +
умным способом:
struct Vec
{
std::vector<int> elems;
};
// Returns a completely new vector.
Vec operator+(const Vec &a, const Vec &b)
{
assert(a.size() == b.size());
Vec ret(a.size());
for (std::size_t i = 0; i < a.size(); i++)
ret.elems[i] = a.elems[i] + b.elems[i];
return ret;
}
// Reuses storage of `a`.
Vec operator+(Vec &&a, const Vec &b)
{
assert(a.size() == b.size());
for (std::size_t i = 0; i < a.size(); i++)
a.elems[i] += b.elems[i];
return std::move(a);
}
// Reuses storage of `b`.
Vec operator+(const Vec &a, Vec &&b)
{
return std::move(b) + a;
}
// Reuses storage of `a`.
Vec operator+(Vec &&a, Vec &&b)
{
return std::move(a) + b;
}
Редактировать: очевидно std::string
делает то же самое: его +
повторно использует память одного из операндов, если это возможно. (Спасибо @ FrancoisAndrieux и @Artyer.)