Si muevo-construye a
desde b
, ¿sigue siendo necesario para destruir b
, o puedo escapar sin hacerlo?¿Se movieron de los objetos necesarios para ser destruidos?
Esta pregunta pasado por la cabeza durante la ejecución de una plantilla optional<T>
. Extracto:
~optional()
{
if (initialized)
{
reinterpret_cast<T*>(data)->~T();
}
}
optional(optional&& o) : initialized(o.initialized)
{
if (initialized)
{
new(data) T(std::move(*o)); // move from o.data
o.initialized = false; // o.data won't be destructed anymore!
}
}
Por supuesto, sólo podría reemplazar al bool initialized
con una enumeración trivaluada que distingue entre inicializado, no inicializado y se trasladó -desde. Solo quiero saber si esto es estrictamente necesario.
¿Por qué usar destructor? ¿por qué no eliminar? después de mudarse, puede establecerlo en 0. – balki
@balki: No estoy seguro de lo que está obteniendo. No hay memoria dinámica en mi plantilla 'opcional', así que no hay nada que 'borrar'. –
fredoverflow
¡Estaba implementando exactamente lo mismo y tenía exactamente la misma pregunta! ¡Gracias! – VF1