Чем rvalue-ссылка отличается от lvalue-ссылки?
то в чем профит использования rvalue ссылок в семантике перемещения
В том, что они позволяют отличить временные объекты, из которых можно утащить кое-что полезное, от постоянных, с которыми  так лучше не поступать. Постоянные объекты будут и дальше копироваться конструкторами копирования. А вот для временных будет выбран конструктор перемещения, если таковой определен.
Использование std::move - это возможность назвать некоторый постоянный с точки зрения языка объект (например, обыкновенную локальную переменную) временным, когда есть уверенность, что его содержимое не нужно далее по коду. Для него все также будет вызван деструктор (т.е. объект, попавший под move-семантику НЕ считается разрушенным после этого), но после процедуры перемещения считается, что объект находится в некотором неопределенном ("пустом"), но валидном состоянии.
Вы можете реализовать класс таким образом. Суть в том что при перемещении вам не надо лишний раз выделять память и копировать данные, а достаточно позаимствовать указатель (объект временный). Для того чтобы компилятор знал какой конструктор использовать нужна rvalue семантика.
Код очень схематичный.class A
{
private:
  char* ptr;
  int size;
public:
  A(char* initial){/*allocate etc*/}
  ~A(){/*deallocate etc*/}

//конструктор копирования
  A(const A& other) { 
    size = other.size;
    ptr = new char[size]; 
    memcpy(ptr, other.ptr, size ); }

//конструктор перемещения
  A(A&& other) {
    size = other.size;
    ptr = other.ptr;

    other.size = 0;
    other.ptr = nullptr; }