New (this) ThisClass () è una cattiva idea?


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

Non ho mai visto questo idioma, e sembra che potrebbe essere davvero sottile e disordinato, ma in realtà non riesco a pensare a un problema con esso (finché FooViewè definitivo). È una cattiva idea?


relative / dupe: stackoverflow.com/questions/58274963/… . Possiamo ottenere l'intero contesto del tipo? Importa.
NathanOliver, il

Risposte:


12

Puoi farlo, ma dovrai ricorrere al riciclaggio di memoria se hai membri di riferimento o const o se il tipo di classe cambia.

Considera questo:

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?
}

Per evitare questo comportamento indefinito, è necessario riciclare la memoria usando std::launder. Il compilatore supporrà che la durata di fvnon sarà influenzata da nulla tranne }. Il riciclaggio farà assumere al compilatore che esiste un oggetto, non correlato a fv:

int main() {
    FooView fv{9};

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

Adesso è una buona idea? Lo sconsiglio dal momento che può creare confusione ma può essere fatto in sicurezza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.