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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top