6
votes

Implémentation d'un opérateur d'incrément de postfix C ++ postfix

J'ai compilé l'exemple suivant: xxx pré>

de Cplusplus.com/reference et je reçois le compilateur AVERTISSEMENT: P>

iterator.cpp: In member function 'myiterator& myiterator::operator++(int)':
iterator.cpp:13: warning: reference to local variable 'tmp' returned


2 commentaires

Cplusplus.com est utile, mais non faisant autorité. Dans ce cas, ça vous a blessé. Si vous regardez le code STL réel, vous constaterez que l'itérateur est souvent renvoyé par la valeur, que Cplusplus.com ne vous a pas dit que vous pouviez faire.


Stackoverflow.com/questions/3181211/...


4 Réponses :


4
votes

Vous ne voulez pas retourner la référence: en le faisant, vous retournez une référence à une variable qui, au moment où la fonction est renvoyée, n'existe plus. Tout ce dont vous avez besoin est:

myiterator operator++(int) {myiterator tmp(*this); operator++(); return tmp;}


3 commentaires

+1 C'est la réponse. J'ajouterais seulement que le message d'erreur vous a dit exactement quel était le problème, et la solution logique à l'erreur donnée est en fait la bonne réponse. Renvoyez la chose par valeur, pas par référence.


Je sais. C'est le code de Cplusplus.com. Je cherche vraiment la définition de l'opérateur d'incrémentation postfix pour les itérateurs STL ...


J'ai raté le lien mon premier lu à travers cela. Oui - Cplusplus.com est faux ici. Sauf cas peut-être un cas extrêmement étrange, ce sera ce que ressemble un opérateur de postfix. Il n'y a aucune règle en disant qu'il ne peut pas renvoyer une référence - cela ne signifie généralement pas parce que cela est inapproprié.



0
votes

Vous retournez une référence à une variable qui est détruite lorsque la méthode sort. Le compilateur vous avertit des conséquences de cela. Au moment où la référence est reçue par l'appelant, la variable qu'elle références n'existe plus.


0 commentaires

3
votes

Cette ligne: xxx

doit être: xxx

comme une note latérale:

vous don ' t réellement besoin du constructeur de copie: xxx

La version générée compilée fonctionnera parfaitement (comme la règle de trois / quatre ne s'applique pas comme vous ne possédez pas le pointeur brut contenu par votre classe) Juste une chose personnelle). xxx

L'opérateur * devrait probablement avoir deux versions. Une version normale et une const. xxx

comme une dernière note: un pointeur par lui-même est un itérateur. Donc, vous n'avez donc pas besoin d'envelopper les pointeurs pour les faire des itérateurs, ils se comporteront correctement en tant qu'hétérateurs (et non seulement des itérateurs d'entrée mais des itérateurs d'accès aléatoire).


0 commentaires

5
votes

y a-t-il quelque part défini ce que la signature postfix devrait ressembler à des itérateurs STL?

la norme.

La norme dicte de telles choses. Dans le cas de cette opération, la norme dit fondamentalement "Vous devez retourner quelque chose qui est convertible vers const x & " où x est l'itérateur. En pratique, cela signifie que vous pouvez retourner par référence si cela s'applique à vous (ce n'est pas), ou retourner par valeur.

Voir 24.1.3 / 1


1 commentaires

Merci de lire la question correctement et d'être à une seule fois la réponse à laquelle je cherchais.