Uso correto de `= delete` para métodos em classes

O snipplet a seguir está correto para cancelar a definição de todos os métodos e construtores gerados de outra forma para uma class

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?
};

Isto exclui todas as implementações padrão do compilador e deixa apenas o destruidor, certo? Sem ela, a classe seria (quase) inutilizável, eu acho, mas eu poderia excluí-la também, correto?

É o tipo de retornoPicture& do movimento-atribuiroperator=(Picture&&) correto? Faz alguma diferença se eu escrevessePicture&& para o tipo de retorno?

questionAnswers(2)

yourAnswerToTheQuestion