Quels sont les types std garantis vides / nuls après avoir été utilisés comme constructeur arg in move

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

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.

Types de déplacement uniquement

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 .

Sémantique de référence partagée

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.

Une exception notable

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…