¿Es nuevo (this) ThisClass () una mala idea?

9
class FooView final : public Something
{
    ...
    void refresh()
    {
        this->~FooView();
        new (this) FooView();
    }
}

Nunca he visto este idioma, y ​​parece que podría ser muy sutil y desordenado, pero en realidad no puedo pensar en un problema con él (mientras FooViewsea ​​definitivo). ¿Es una mala idea?

luqui
fuente
relacionado / engañado: stackoverflow.com/questions/58274963/… . ¿Podemos obtener el contexto completo del tipo? Si importa.
NathanOliver

Respuestas:

12

Puede hacerlo, pero necesitará lavado de memoria para eso si tiene miembros de referencia o constantes, o si cambia el tipo de clase.

Considera esto:

struct FooView {
    const int val;

    void refresh()
    {
        this->~FooView();
        new (this) FooView{5};
    }
}

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << fv.val; // hmm... val is a const object, so it's 9 still?
}

Para evitar este comportamiento indefinido, debe lavar la memoria utilizando std::launder. El compilador asumirá que la vida útil de fvno se verá afectada por nada, excepto }. El lavado hará que el compilador suponga que hay un objeto, no relacionado con fv:

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << std::launder(&fv)->val; // yay, 5
}

Ahora es una buena idea? Aconsejaría en contra, ya que puede generar confusión, pero se puede hacer de manera segura.

Racicot Guillaume
fuente