Lorsqu'un conteneur est déplacé, il est placé dans un "état valide mais non spécifié" selon le projet de norme C 0x . Dans une telle situation, il est crucial de comprendre comment réutiliser correctement le conteneur déplacé.
Considérez l'extrait de code suivant :
std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2);
Selon la norme, l'option ver3, qui implique de réinitialiser le conteneur déplacé, est la bonne approche. En effet, après une opération de déplacement, un objet est placé dans un état non spécifié.
La norme définit un « état valide mais non spécifié » comme suit :
"un état d'objet qui n'est pas spécifié sauf que les invariants de l'objet sont satisfaits et que les opérations sur l'objet se comportent comme spécifié pour son type"
Cela signifie que l'objet déplacé reste actif et peut être utilisé, mais seulement si les conditions préalables sont remplies. Dans le cas d'un vecteur, effacer le conteneur avec clear() n'a aucune condition préalable et le ramène à un état connu.
Par conséquent, il est recommandé d'utiliser clear() pour réinitialiser un conteneur déplacé et remettez-le dans un état utilisable.
L'option ver2, qui implique d'appeler clear() sur le conteneur déplacé, est également valide. Cependant, cela peut conduire à des optimisations en supposant que le conteneur déplacé est vide. L'utilisation de clear() garantit que le conteneur revient à un état connu, quelles que soient les optimisations.
L'option ver1, qui implique de ne rien faire, n'est pas recommandée. En effet, le conteneur est dans un état non spécifié après le déplacement et peut présenter un comportement inattendu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!