Antecedentes: Tengo una clase complicada con muchas variables. Tengo un sonido y probado constructor de copia:¿Puedo usar la ubicación nueva (this) en operator =?
Applepie::Applepie(const Applepie ©) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}
Algunos de los constructores de copia variable miembro llamada en la lista intializer realizar la asignación.
Pregunta: Necesito crear operator=
. En lugar de duplicar la Constuctor existente con la asignación en lugar de lista de inicialización, y la memoria de la liberación que está siendo reemplazado, y etc, etc, etc, puedo simplemente hacer lo siguiente:
Applepie& Applepie::operator=(const Applepie ©)
{
if(this != ©)
{
this->~Applepie(); // release own object
new(this) Applepie(copy); // placement new copy constructor
}
return *this;
}
En otras palabras, es destruir el auto seguido de una colocación nuevo constructor de copia semánticamente idéntico a operator =?
Esto parece tener el potencial de reducir drásticamente la repetición de código y confirmar que cada variable se inicializa correctamente, a costa de una ligera pérdida potencial de eficiencia durante la asignación. ¿Me estoy perdiendo algo más oscuro?
Justificación: Mi clase real tiene aproximadamente 30 varaibles. Me preocupa el hecho de que tanto mi constructor de copia como mi operador de asignación tengan que copiar los treinta, y que el código pueda divergir, haciendo que las dos operaciones hagan las cosas de manera diferente.
Si el controlador de copia tira, ha roto el objeto, por lo que no está dando garantías de seguridad. –
@R Martinho - Me parece que cualquier situación en la que el controlador de copia arrojaría también causaría que mi operador = arrojara si estuviera asignando manualmente cada variable ... Entonces ... ¿eso todavía parece equivalente? – jcwenger
el problema no es 'operator =' throwing, es 'operator =' dejando el objeto en un estado inválido! Ha sido destruido. –