Je sais que shared_ptr
, unique_ptr
, weak_ptr
sont garantis vides après utilisation en tant qu’argument RVR dans le constructeur du même type, mais je me demande si la norme le spécifie pour certains autres types std::
côté de ceux que j’ai mentionnés.
Veuillez noter que je sais que les éléments après déplacement sont laissés dans un état valide mais non spécifié , je suis ici intéressé par quel type est spécifié
En règle générale: Les types de déplacement uniquement ou les types avec sémantique de référence partagée laissent leur object déplacé dans un état vide. Tous les autres types laissent des valeurs non spécifiées.
Les types de déplacement uniquement (qui laissent les objects déplacés à l’état vide) sont 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
et std::unique_ptr
.
Les types avec une sémantique de référence partagée sont std::shared_future
, et bien sûr std::shared_ptr
et std::weak_ptr
. Ceux-ci laissent également leurs objects déplacés dans un état vide.
En parcourant la bibliothèque standard, j’ai trouvé std::ssortingngstream
et ses std::ssortingngstream
et std::ssortingngstream
entrée seule et en sortie uniquement ( std::issortingngstream
et std::ossortingngstream
) comme exception notable. Ces classes sont uniquement mobiles, mais rien n’est dit sur l’object déplacé lors de la construction du déplacement. Par conséquent, la règle valide-mais-non spécifiée s’applique. Comme vous le voyez, ce n’est qu’une règle générale, pas toujours correcte.
Les types quittant les objects déplacés dans l’état “vide” sont les pointeurs intelligents, les verrous ( [thread.lock.unique.cons] / 21 , [thread.lock.shared.cons] / 21 ), les stream de fichiers ( [filebuf.cons]). /(4.2) ), futures ( [futures.unique_future] / (8.2) , [futures.shared_future] / 10 ), promesses ( [futures.promise] / 6 ), tâches empaquetées ( [futures.task] / 7 ), discussions ( [thread.thread.constr] / 10 ),…
En revanche, les modèles laissant les objects déplacés avec des valeurs non spécifiées sont function
( [func.wrap.func.con] / 6 ), basic_regex
( [re.regex.construct] / 13 ), basic_ssortingng
( [ssortingng.cons] / 2 ), des conteneurs…