Comprendre l'absence de valeur de retour dans std::queue::pop
En C , la classe std::queue fournit un pop méthode qui ne renvoie aucune valeur. Ce choix de conception peut sembler contre-intuitif, car on pourrait s'attendre à ce qu'une opération pop renvoie la valeur supprimée de la file d'attente. Cependant, il y a des raisons spécifiques à cette conception.
Au départ, la documentation indique qu'il est plus logique que pop ne renvoie pas de valeur et demande plutôt aux clients d'utiliser front() pour récupérer la valeur au début du file d'attente. Alors que front() nécessite également que l'élément soit copié dans une variable lvalue, la différence réside dans la sécurité des exceptions.
En cas d'exceptions, renvoyer une valeur par valeur, comme devrait le faire pop, peut être dangereux . Considérons un scénario où la méthode pop est définie comme suit :
template<class T> T pop() { auto x = elements[top_position]; --top_position; return x; }
Si le constructeur de copie de T lève une exception au retour, l'état de la file d'attente aura déjà été modifié, mais l'élément n'aura pas a été renvoyé, le perdant ainsi de la file d'attente. Ce comportement est à la fois dangereux et inefficace si la valeur extraite n'est pas destinée à être utilisée.
Pour résoudre ces problèmes, std::queue adopte une approche plus sûre et plus efficace en séparant les opérations en void pop et const T& front (). Cela permet des opérations de file d'attente sécurisées et efficaces tout en garantissant la sécurité des exceptions et en empêchant la copie inutile des valeurs inutilisées.
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!