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.
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-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
.
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.
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.
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 ...
Tags und Links c++ c++11 move-semantics c++14