Ist new (this) ThisClass () eine schlechte Idee?

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

Ich habe diese Redewendung noch nie gesehen, und es scheint, als könnte sie wirklich subtil und chaotisch sein, aber ich kann mir kein Problem damit vorstellen (solange FooViewes endgültig ist). Ist das eine schlechte Idee?

luqui
quelle
verwandt / betrogen: stackoverflow.com/questions/58274963/… . Können wir den vollständigen Kontext des Typs erhalten? Es ist wichtig.
NathanOliver

Antworten:

12

Sie können dies tun, benötigen dafür jedoch Speicherwäsche, wenn Sie Referenz- oder Konstantenelemente haben oder wenn sich der Typ der Klasse ändert.

Bedenken Sie:

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

Um dieses undefinierte Verhalten zu vermeiden, sollten Sie den Speicher mit waschen std::launder. Der Compiler geht davon aus, dass die Lebensdauer von fvdurch nichts anderes beeinflusst wird }. Beim Waschen nimmt der Compiler an, dass es ein Objekt gibt, das nichts mit Folgendem zu tun hat fv:

int main() {
    FooView fv{9};

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

Ist es jetzt eine gute Idee? Ich würde davon abraten, da dies zu Verwirrung führen kann, aber sicher durchgeführt werden kann.

Guillaume Racicot
quelle