2011-06-28 17 views

Respuesta

172

Es un new C++11 feature.

Significa que desea utilizar la versión generada por el compilador de esa función, por lo que no necesita especificar un cuerpo.

También puede usar = delete para especificar que no desea que el compilador genere esa función automáticamente.

Con la introducción de los constructores de movimientos y los operadores de asignación de movimiento, las reglas para cuando se generan versiones automáticas de constructores, destructores y operadores de asignación se han vuelto bastante complejas. Usar = default y = delete hace las cosas más fáciles ya que no necesita recordar las reglas: simplemente diga lo que quiere que suceda.

+8

'= delete' es más fuerte: Significa que el uso de esa función está prohibido, aunque todavía forma parte de la resolución de sobrecarga. – Deduplicator

34

Este es un nuevo C++ 0x característica que le dice al compilador para crear la versión defecto de los respectivos constructor o asignación operador, es decir, la que acaba realiza la copia o mover de acción para cada miembro. Esto es útil porque el constructor de movimientos no siempre se genera de forma predeterminada (por ejemplo, si tiene un destructor personalizado), a diferencia del constructor de copias (y también para la asignación), pero si no hay nada trivial que escribir, es mejor dejar que compilador que lo deletree usted mismo cada vez.

Observe también que un constructor predeterminado no se generaría si proporciona cualquier otro constructor no predeterminado. Si aún desea el constructor predeterminado, también puede usar esta sintaxis para que el compilador realice una.

Como en otro caso de uso, hay varias situaciones en las que un constructor de copia no se generaría implícitamente (por ejemplo, si proporciona un constructor de movimiento personalizado). Si aún desea la versión predeterminada, puede solicitarla con esta sintaxis.

Consulte la Sección 12.8 de la norma para obtener más información.

+3

Aunque no es solo para constructores y asignaciones, sino que también se aplica a 'operator new/new []', 'operator delete/delete []' y sus sobrecargas. –

13

Es nuevo en C++ 11, vea here. Puede ser bastante útil si ha definido un constructor, pero quiere usar los valores predeterminados para los demás. Antes de C++ 11, tendría que definir todos los constructores una vez que haya definido uno, incluso si son equivalentes a los valores predeterminados.

en cuenta también que en ciertas situaciones, es imposible proporcionar un constructor predeterminado definido por el usuario que se comporta igual que el compilador sintetizado uno bajo tanto predeterminado y valor inicialización. default le permite recuperar ese comportamiento.

+0

en relación con el segundo párrafo, ¿me puede dar un ejemplo? –

5

Otro caso de uso que no veo mencionado en estas respuestas es que le permite cambiar fácilmente la visibilidad de un constructor. Por ejemplo, tal vez desee que una clase amigo pueda acceder al constructor de copias, pero no desea que esté disponible públicamente.

Cuestiones relacionadas