Die Hauptanwendung ich für finally
finden würde wäre, wenn mit C-Code zu tun, wie andere darauf hingewiesen, wo eine C-Ressource nur einmal verwendet werden kann oder zweimal im Code und nicht wirklich wert in eine RAH-konformen Struktur gewickelt wird. Das heißt, mit Lambdas scheint es einfach zu sein, nur eine benutzerdefinierte Logik durch einen Aufruf eines Funktionsobjekts aufzurufen, das wir in der Funktion selbst angeben. Der andere Anwendungsfall, den ich finden würde, ist für exotischen gemischten Code, der ausgeführt werden sollte, unabhängig davon, ob wir uns in einem normalen oder außergewöhnlichen Ausführungspfad befinden, wie das Drucken eines Zeitstempels oder etwas beim Beenden einer Funktion. Das ist so ein seltener Fall für mich, dass es wie Overkill erscheint, ein Sprachfeature nur dafür zu haben, und es ist immer noch so einfach mit Lambdas zu machen, ohne eine separate Klasse nur für diesen Zweck schreiben zu müssen.
In den meisten Fällen würde ich sehr eingeschränkte Anwendungsfälle finden, die eine so große Änderung der Sprache nicht wirklich rechtfertigen. Mein kleiner Wunschtraum ist jedoch eine Möglichkeit, innerhalb eines Objekts zu sagen, ob das Objekt durch einen normalen Ausführungspfad oder einen außergewöhnlichen Pfad zerstört wird.
Das würde die Überwachung des Bereichs vereinfachen, so dass ein Aufruf commit/dismiss
nicht mehr erforderlich ist, um die Änderungen zu akzeptieren, ohne sie automatisch wiederherzustellen, wenn der Schutz des Oszilloskops zerstört wird. Die Idee ist, um dies zu ermöglichen:
ScopeGuard guard(...);
// Cause external side effects.
...
// If we managed to reach this point without facing an exception,
// dismiss/commit the changes so that the guard won't undo them
// on destruction.
guard.dismiss();
Um dies einfach geworden:
ScopeGuard guard(...);
// Cause external side effects.
...
Ich fand immer die Notwendigkeit zu entlassen Umfang schützt ein wenig umständlich zu machen sowie fehleranfällig, da ich manchmal vergessen, sie zu entlassen, nur um sie alle Änderungen rückgängig zu machen, mich für einen Moment meinen Kopf kratzen, warum meine Operation schien überhaupt nichts zu tun, bis ich realisierte, "oops, habe ich vergessen, den Schutzumfang zu entlassen.". Es ist eine kleine Sache, aber meistens würde ich es so viel eleganter finden, die Notwendigkeit einer expliziten Entfernung des Schutzbereichs zu eliminieren, die möglich wäre, wenn sie innerhalb ihrer Destruktoren einfach sagen könnten, ob sie durch normale Ausführungspfade zerstört werden zeigen die Nebenwirkungen sollten beibehalten werden) oder außergewöhnliche (zu welchem Zeitpunkt die Nebenwirkungen rückgängig gemacht werden sollten).
Es ist die kleinste Sache, aber in der härtesten Bereich der Ausnahme-Sicherheit, um richtig zu machen: externe Nebenwirkungen zurückrollen. Ich könnte nicht mehr von C++ verlangen, wenn es darum geht, lokale Ressourcen einfach zu zerstören. Es ist schon ziemlich ideal für diesen Zweck. Aber externe Nebenwirkungen zurückzudrängen, war in jeder Sprache, in der sie überhaupt auftreten können, immer schwierig, und jedes kleine bisschen Hilfe, um das zu erleichtern, ist etwas, das ich immer schätzen würde.
Sie stellen zwei verschiedene Fragen. Der Titel fragt, warum es schließlich keine gibt, und der eigentliche Beitrag fragt nach Beispielen für Fälle, in denen es letztendlich besser wäre als RAII. Ich schlage vor, dass Sie einen von ihnen bearbeiten, damit sie zusammenpassen. Es ist verwirrend für Leute, die bei einer Suche auf diesen Beitrag stoßen. – jalf