<< opérateur et Surcharge récursion
-
23-09-2019 - |
Question
J'ai essayé le code suivant:
#include <iostream>
using std::cout;
using std::ostream;
class X
{
public:
friend ostream& operator<<(ostream &os, const X& obj)
{
cout << "hehe"; // comment this and infinite loop is gone
return (os << obj);
}
};
int main()
{
X x;
cout << x;
return 0;
}
Quand je compile et lance cela, il est comme prévu; une boucle infinie. Si je supprime l'instruction cout
dans la fonction ami, la récursion ne se produit pas. Pourquoi est-il?
La solution
Optimizer décide toutes vos activités restantes n'a aucun effet et optimise aussi. Que ce soit bien ou mal est une autre affaire.
En particulier:
X x;
crée un objet de vide "x"
cout << x;
appelle:
return (os << obj);
qui est annexant objet vide; le compilateur de l'os 'avis n'a pas augmenté depuis le tout dernier appel et ne montre aucune promesse de faire, toute autre (et rien ne se passe) il décide toute l'affaire est redondant et peut être tronqué à ce stade.
Si vous appelez
cout << "hehe"; // comment this and infinite loop is gone
il y a une activité supplémentaire afin que l'optimiseur ne supprime pas l'appel suivant.
Je suppose que si vous avez initialisé x
avec quoi que ce soit non vide, ou effectué toute activité non nul autre que cout << "hehe";
, vous auriez récursion courir la même chose.
Autres conseils
Dans les deux cas (avec et sans écrire "hehe") Visual Studio 2005 donne l'avertissement suivant:
warning C4717: 'operator<<' : recursive on all control paths, function will cause runtime stack overflow
Dans les deux cas, il compile et dans les deux cas, il donne un débordement de pile.
Cependant, sans le « hehe » le débordement de la pile se produit un peu plus tôt.