El uso correcto de `= borrar` para los métodos en las clases

Es la siguiente snipplet correcta para onu-definir todo lo contrario generada métodos y constructores 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?
};

De esta forma se elimina cada compilador por defecto la aplicación y sólo deja el destructor, ¿verdad? Sin que la clase iba a ser (casi) inutilizable supongo, pero podía borrar es así, ¿correcto?

Es el tipo de retorno Picture& de la mover-asignar operator=(Picture&&) correcta? No hace una diferencia si escribí Picture&& para el tipo de retorno?

  • Parece como C++ ha cambiado mucho en C++0x!, Cosas interesantes.
  • es una sintaxis más clara, a continuación, la práctica común de ocultar los métodos en un private sección, y sólo declarar, pero no los define.
InformationsquelleAutor towi | 2011-04-16

2 Kommentare

  1. 27

    Además de Xeo la respuesta:

    Sí, todo está correcto. Si quería usted podría eliminar todos los eliminados los miembros, sino que la elimina constructor de copia y el borrado de la copia de asignación y tienen el mismo efecto:

    struct Picture {  //Also ok
    
      //'explicit': no accidental cast from string to Picture
      explicit Picture(const string &filename) { /* load image from file */ }
    
      //no copy
      Picture(const Picture&) = delete;
    
      //no assign
      Picture& operator=(const Picture&) = delete;
    };

    La declaración explícita de que el constructor de copia inhibe la implícita la generación de el constructor predeterminado, mover constructor y mover la asignación de los miembros. Tener estos miembros eliminado explícitamente es una cuestión de gusto. Algunos probablemente lo veo como una buena documentación. Los demás lo vean como excesivamente detallado.

    • Gracias, he pasado por alto que en el texto del proyecto. Que ahorra tiempo escribiendo. Supongo que yo podría = default ellos si quería entrar?
    • Sí. Usted puede explícitamente defecto de ellos o elimine de forma explícita.
  2. 3

    Parece bien a mí. El valor de retorno de operator= debe ser una referencia normal, incluso si el objeto es construido a partir de un r-value de referencia. Eso es porque usted no sólo puede compilar un lvalue (*this) a un r-value.

    Y se debe tomar r-value de referencia por no const Picture& operator=(Picture&&). ¿Cómo se desplaza de un objeto de constante? 😉

    • Por supuesto, la forma tonta de mí. Tienes razón en ambas cuentas. Permítanme corregir en la cuestión, de modo que los lectores no aprender de mis fallos de ejemplo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...