Welche std-Typen garantiert leer / null sind, nachdem sie im Konstruktor von move als arg verwendet wurden

8

Ich weiß, shared_ptr , unique_ptr , weak_ptr sind garantiert leer, nachdem sie im Konstruktor des gleichen Typs als RVR-Argument verwendet wurden, aber ich frage mich, ob Standard dies für einige andere std:: -Typen neben dem angibt diejenigen, die ich erwähnt habe.

Bitte beachten Sie, dass ich weiß, dass Elemente nach dem Verschieben in einem gültigen, aber nicht spezifizierten Zustand belassen werden. Ich bin hier interessiert, für welche Typen der Status angegeben ist.

    
NoSenseEtAl 13.01.2016, 16:40
quelle

2 Antworten

6

Eine Faustregel

Als Faustregel gilt: Nur verschiebbare Typen oder Typen mit gemeinsam genutzter Referenzsemantik belassen das Objekt, aus dem es entfernt wurde, in einem leeren Zustand. Alle anderen Typen hinterlassen nicht festgelegte Werte.

Nur verschiebbare Typen

Nur-Verschiebe-Typen (die von Objekten in einem leeren Zustand verschoben werden) sind std::unique_lock , std::thread , std::promise , std::packaged_task , std::future , basic_filebuf , std::basic_ifstream , std::basic_ofstream , std::basic_fstream , std::shared_lock und std::unique_ptr .

Geteilte Referenzsemantik

Typen mit gemeinsamer Referenzsemantik sind std::shared_future und natürlich std::shared_ptr und std::weak_ptr . Diese hinterlassen ihre bewegten Objekte auch in einem leeren Zustand.

Eine bemerkenswerte Ausnahme

Als ich die Standardbibliothek durchging, fand ich std::stringstream und seine Nur-Eingabe- und Ausgabe-Geschwister ( std::istringstream und std::ostringstream ) als eine bemerkenswerte Ausnahme. Bei diesen Klassen handelt es sich um "Nur Verschieben", aber bei der Konstruktion der Bewegung wird nichts über das verschobene Objekt gesagt. Daher gilt die gültig-aber-nicht-spezifizierte-Regel. Wie Sie sehen, ist es nur eine Faustregel, nicht 100% immer korrekt.

    
Ralph Tandetzky 13.01.2016, 22:19
quelle
10

Typen, die bewegte Objekte vom "leeren" Zustand verlassen, sind intelligente Zeiger, Sperren ( [ thread.lock.unique.cons] / 21 , [thread.lock.shared .cons] / 21 ), Dateiströme ( [filebuf.cons] / (4.2) ), Futures ( [futures.unique_future] / (8.2) , [futures.shared_future]/10 ), verspricht ( [futures.Promise] / 6 ), verpackte Aufgaben ( [futures.task] / 7 ), Themen ( [ thread.thread.constr] / 10 ), ...

Im Gegensatz dazu sind Vorlagen, die die verschobenen Objekte mit nicht angegebenen Werten verlassen, function () [func.wrap.func.con] / 6 ), basic_regex ( [re .regex.construct] / 13 ), basic_string ( [string.cons] / 2 ), Container ...

    
Columbo 13.01.2016 17:15
quelle

Tags und Links