Uso correcto de `= delete` para métodos en clases

Es correcto el siguiente snipplet para anular la definición de todos los métodos y constructores generados para una clase?

struct Picture {

  // 'explicit': no accidental cast from string to Picture
  explicit Picture(const string &filename) { /* load image from file */ }

  // no accidental construction, i.e. temporaries and the like
  Picture() = delete;

  // no copy
  Picture(const Picture&) = delete;

  // no assign
  Picture& operator=(const Picture&) = delete;

  // no move
  Picture(Picture&&) = delete;

  // no move-assign
  Picture& operator=(Picture&&) = delete; // return type correct?
};

Esto elimina todas las implementaciones predeterminadas del compilador y solo deja el destructor, ¿verdad? Sin ella, la clase sería (casi) inutilizable, supongo, pero también podría eliminarla, ¿correcto?

Es el tipo de retornoPicture& de mover-asignaroperator=(Picture&&) correcto? ¿Hay alguna diferencia si escribíPicture&& para el tipo de devolución?

Respuestas a la pregunta(2)

Su respuesta a la pregunta