6
votes

référence avant et pop_front

est-ce légal ?:

Sample& sample = stack.front();
stack.pop_front();


0 commentaires

3 Réponses :


13
votes

Non, ce n'est pas légal. Vous devez prendre une copie de l'objet, c'est-à-dire utilisez xxx

si vous utilisez un std :: vecteur , le pop_front appelle déplace Les éléments de l'emplacement et de votre référence indiquent à un élément différent (le deuxième deuxième élément de nouveau.)


3 commentaires

Vous ne pouvez pas le faire facilement. Avec échantillon et exemple , vous avez délibérément demandé une référence, vous en avez donc une. Si la performance n'est pas critique, utilisez simplement échantillon d'échantillon = ou (encore plus facile) échantillon automatique = qui copiera-valeur par défaut. N'oubliez pas: C ++ est une langue d'expert et il est facile de se tirer dans le pied si vous ne faites pas attention.


En général, l'ajout et l'élimination des éléments vers / des conteneurs invalident les références à des éléments à l'intérieur du conteneur. Il existe des exceptions, mais à tout moment, vous voyez une référence à un élément dans un conteneur, vous devez vous inquiéter de cela. (Genre de comme à tout moment que vous voyez un appel à neuf , votre première question devrait être, où est le correspondant ?) Avec une petite expérience, il deviendra une habitude .


@Anteru Si la copie coûte cher, comment pouvons-nous utiliser référence?



0
votes

Non, bien sûr pas. Une fois que vous avez supprimé l'objet de la collection, vous ne pouvez rien faire référence à votre référence.


0 commentaires

1
votes

Si pile basé sur std :: deque . Exactement le même comportement pour std :: vecteur et std :: list .

de la norme:

std :: deque :: pop_front :

Itérateurs et Références à l'élément effacé sont invalidés. Si l'élément est le dernier élément du conteneur, l'itérateur de l'extrémité passé est également invalidé. D'autres références et itérateurs ne sont pas affectés.


0 commentaires