Kann ein Stapel eine sichere Ausnahmemethode zum Zurückgeben und Entfernen des obersten Elements mit Verschiebungssemantik haben?

9

In einer Antwort auf eine Frage zu std::stack::pop() behauptete ich dass der Grund pop den Wert aus Gründen der Ausnahmesicherheit nicht zurückgibt (was passiert, wenn der Kopierkonstruktor eingibt).

@Konrad kommentierte, dass dies jetzt mit der Bewegungssemantik nicht mehr relevant ist. Ist das wahr?

AFAIK, Konstrukteure bewegen kann throw , aber vielleicht mit noexcept kann es immer noch erreicht werden.

Für Bonuspunkte, welche Fadensicherheitsgarantien kann dieser Vorgang liefern?

    
Motti 12.04.2010, 06:58
quelle

2 Antworten

3

Natürlich ist nicht jeder Typ move-fähig und C ++ 0x erlaubt sogar das Werfen von Move-Konstruktoren. Solange das Konstruieren des Objekts aus einem R-Wert es werfen kann, kann es nicht ausnahmesicher sein. Die Verschiebungssemantik ermöglicht Ihnen jedoch, viele Typen zu haben, die bei einer rvalue-Quelle nicht zusammengebaut werden können.

Eine bedingte Unterstützung dafür könnte mit SFINAE erfolgen. Aber auch ohne eine solche bedingte Memberfunktion hält dich nichts davon ab zu schreiben:

%Vor%

was die starke Ausnahme garantiert, selbst wenn Ihr Move-Konstruktor keine starke Garantie gibt.

    
sellibitze 12.04.2010, 07:13
quelle
2

Was die Bonusfrage betrifft, würde das keine Thread-Sicherheit bieten. Beachten Sie, dass als Beispiel die meisten Implementierungen von std::vector drei Datenelemente haben (Zeiger auf den Anfang des Speichers, Zeiger eins hinter dem Ende der verwendeten Daten, Zeiger eins hinter dem Ende des zugewiesenen Speichers). Mit der Verschiebungssemantik können Sie den Inhalt des Vektors verschieben , ohne Werte neu zuweisen und kopieren zu müssen. Dies hat jedoch nichts mit der Thread-Sicherheit zu tun. Sie müssten threadsichere Konstrukte verwenden, um die Struktur threadsicher zu machen (da moving nicht unbedingt atomare bedeutet)

    
quelle