Il y a une fonction pour l'élément, l'autre pour la supprimer:
typedefqueue<MyClass>MyQueue;MyQueue q;
q.push(MyClass(42));//...MyClassconst& rx = q.front();
rx.print();MyClass x = q.front();//Copies the front element to a fresh object
q.pop();//From this point, rx is a dangling reference
assert(x ==MyClass(42));
Justification: si il y avait un seul pop fonction qui retourne l'élément avant, il ne serait pas possible d'obtenir une référence à l'élément avant, car elle aurait été retiré de la file d'attente. Si vous voulez juste lire un énorme élément avant de le jeter, vous avez sûrement ne voulez pas que votre code pour effectuer une copie.
EDIT: Une raison plus fondamentale est que le fait d'avoir deux fonctions, l'utilisateur est responsable de faire la copie. Supposons qu'il existe une seule et unique pop fonction: qu'arriverait-il si le constructeur de copie (à l'intérieur de pop) déclenche une exception ? (cf. @Steve Jessop 'commentaire)
... et même si vous ne souhaitez faire une copie, il n'y a aucun moyen de revenir en valeur tout en offrant une forte exception de garantie. La copie à l'appelant de la lvalue prend place après, l'objet a été supprimé de la file d'attente, donc si la copie ctor ou d'assignation de copie (selon qu'il est dans ce cas précis) lève une exception, la file d'attente a déjà été sauté. vous avez raison. Pour être complet, il convient de mentionner une exception de sécurité. comme l'a souligné Steve, la justification est d'environ exception des garanties, pas sur interface, car vous pourriez avoir à la fois front et un pop qui retourne une copie. C'était à ce comportement, ou d'exiger que la copie constructeurs peuvent ne pas jeter. C. Deux copies de ne pas le faire. Il faudrait, en n'exigeant pas seulement RVO, mais aussi une forme de RVO qui permet à un copier-affectation pour être sur place, et pas seulement une copie de la construction, pour faire MyClass x; x = q.pop(); exception-safe. C'est juste pas faisable en C++ tel que nous le connaissons. Une mesure alternative plus simple serait pour pop à prendre une non-const paramètre de référence, et la copie de l'objet à l'avant en que avant de modifier la file d'attente. Qui peut ensuite être facilement exception-safe, et autant que je sache la raison, il n'est pas offerte est juste que c'est une simple combinaison de front() et pop(), afin de BRICOLAGE. en fait, ce qui peut être fait avec une autre interface queue.pop(item), à l'aide d'affectation au lieu de la copie de la construction. C'est moins idiomatiques, je suppose.
Pas, elle retourne une référence à l'élément avant. Si vous avez besoin de sortir l'élément pop(). Voir std::file d'attente de référence pour plus de détails.
Les deux formes de retour de l'élément suivant de la file d'attente. L'appelant doit veiller à ce que la file d'attente contient un élément (size()>0); sinon, le comportement est indéfini. La première forme de non constante files d'attente renvoie une référence. Donc, vous pouvez modifier l'élément suivant dans la file d'attente. C'est à vous de décider si c'est un bon style.
Utiliser les menus pour le supprimer. Il supprime l'élément suivant de la file d'attente. L'élément suivant l'élément qui a été inséré en premier (avant tous les autres éléments dans la file d'attente). Cette fonction n'a pas de valeur de retour. Pour traiter l'élément suivant, vous devez appeler avant() en premier.
Il y a une fonction pour l'élément, l'autre pour la supprimer:
Justification: si il y avait un seul
pop
fonction qui retourne l'élément avant, il ne serait pas possible d'obtenir une référence à l'élément avant, car elle aurait été retiré de la file d'attente. Si vous voulez juste lire un énorme élément avant de le jeter, vous avez sûrement ne voulez pas que votre code pour effectuer une copie.EDIT: Une raison plus fondamentale est que le fait d'avoir deux fonctions, l'utilisateur est responsable de faire la copie. Supposons qu'il existe une seule et unique
pop
fonction: qu'arriverait-il si le constructeur de copie (à l'intérieur depop
) déclenche une exception ? (cf. @Steve Jessop 'commentaire)vous avez raison. Pour être complet, il convient de mentionner une exception de sécurité.
comme l'a souligné Steve, la justification est d'environ exception des garanties, pas sur
interface
, car vous pourriez avoir à la foisfront
et unpop
qui retourne une copie. C'était à ce comportement, ou d'exiger que la copie constructeurs peuvent ne pas jeter.C. Deux copies de ne pas le faire. Il faudrait, en n'exigeant pas seulement RVO, mais aussi une forme de RVO qui permet à un copier-affectation pour être sur place, et pas seulement une copie de la construction, pour faire
MyClass x; x = q.pop();
exception-safe. C'est juste pas faisable en C++ tel que nous le connaissons. Une mesure alternative plus simple serait pourpop
à prendre une non-const paramètre de référence, et la copie de l'objet à l'avant en que avant de modifier la file d'attente. Qui peut ensuite être facilement exception-safe, et autant que je sache la raison, il n'est pas offerte est juste que c'est une simple combinaison defront()
etpop()
, afin de BRICOLAGE.en fait, ce qui peut être fait avec une autre interface
queue.pop(item)
, à l'aide d'affectation au lieu de la copie de la construction. C'est moins idiomatiques, je suppose.OriginalL'auteur Alexandre C.
Pas, elle retourne une référence à l'élément avant. Si vous avez besoin de sortir l'élément
pop()
. Voir std::file d'attente de référence pour plus de détails.OriginalL'auteur vitaut
Définitions de Type de l'avant de l'opération pour la file d'attente.
Les deux formes de retour de l'élément suivant de la file d'attente. L'appelant doit veiller à ce que la file d'attente contient un élément (size()>0); sinon, le comportement est indéfini. La première forme de non constante files d'attente renvoie une référence. Donc, vous pouvez modifier l'élément suivant dans la file d'attente. C'est à vous de décider si c'est un bon style.
Utiliser les menus pour le supprimer. Il supprime l'élément suivant de la file d'attente. L'élément suivant l'élément qui a été inséré en premier (avant tous les autres éléments dans la file d'attente). Cette fonction n'a pas de valeur de retour. Pour traiter l'élément suivant, vous devez appeler avant() en premier.
OriginalL'auteur DumbCoder