>>515前半
class ptr {
  int *p;
public:
  ptr() : p(new int) {}
  ptr(ptr const& y) : p(new int(*y.p)) {}
  ptr& operator =(ptr const& y) {ptr(y).swap(*this); return *this;}
  ~ptr() {delete p;}
  void swap(ptr& y) {std::swap(p, y.p);}
};
こんなよくありそうなクラスにムーブ構築・代入を定義する場合、
パッと考えつくだけでも2とおりある(ここでは代入で書いたけど、コンストラクタでも同じ)。
ptr& operator =(ptr&& y) {
  swap(y);
  return *this;
}
ptr& operator =(ptr&& y) {
  delete p;
  p = y.p;
  y.p = nullptr;
  return *this;
}
ムーブした後、yがどうなっているか違うけど、どっちでもムーブとしての挙動は行われるはず。
もちろん、yはデストラクタが呼ばれても問題ないのも同じ。

こういう話でいいのかな。