2009-02-08 6 views
3

J'ai une question sur le comportement standard d'appeler tellp sur un ostringstream vide. J'ai une fonction foo qui appelle tellp la première chose:Comportement standard de tellp sur vide ostringstream

void foo(std::ostream& os) 
{ 
    std::ostream::pos_type pos = os.tellp(); 
    // do some stuff. 
} 

int main() 
{ 
    std::ostringstream os; 
    foo(os); 
} 

Dans Visual Studio 2005, appelant cette fonction avec un ostringstream nouvellement créé et vide les résultats dans la variable pos être définie sur une pos_type invalide, ce qui dans Visual Studio 2005 est défini sur pos_type(_BADOFF).

ofstream n'a pas le même comportement, où tellp renvoie pos_type(0), ce qui correspond à pos_type valide.

Est-ce le comportement conforme standard? Ce comportement est-il cohérent avec les autres compilateurs?

+0

Dans les blocs de code IDE, pos est mis à 0 où comme dans MSVC++ 6.0 IDE c'est -1 – CppLearner

Répondre

1

27.6.2.4:

pos_type tellp(); 

retour: si fail() = false, retourne pos_type (-1) pour indiquer l'échec. Sinon, renvoie rdbuf() -> pubseekoff (0, cur, sur).

Et pubseekoff renvoie -1 en cas d'échec. Mais je ne sais pas pourquoi cela se produit pour vous dans le cas de ostringstream, peut-être était trop fatigué pour trouver les mots sur undefined ou dépend de l'implémentation. En utilisant mon bon sens, je dirais que pour ostringstream cela devrait donner 0, par défaut construit ostream -1, et pour ostream avec fraîchement ouvert le fichier 0.

+0

Je suis d'accord que cela devrait donner 0 pour 'ostringstream', donc je suppose que c'est un bogue dans la bibliothèque C++ Standard de VS2005. – dalle

Questions connexes