J'ai compilé l'exemple suivant: 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
4 Réponses :
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;}
+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é.
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. P>
Cette ligne: doit être: p> comme une note latérale: p> vous don ' t réellement besoin du constructeur de copie: p> 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). p> L'opérateur * devrait probablement avoir deux versions. Une version normale et une const. P> comme une dernière note: un pointeur par lui-même
y a-t-il quelque part défini ce que la signature postfix devrait ressembler à des itérateurs STL? P> blockQuote>
la norme. P>
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 & code>" où
x code> 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. P>
Voir 24.1.3 / 1 P>
Merci de lire la question correctement et d'être à une seule fois la réponse à laquelle je cherchais.
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/...