12
votes

Renvoyer Stringstream d'une fonction

Clairement, il me manque quelque chose d'important sur les stringstreams en général ici, mais quelqu'un pourrait-il expliquer pourquoi xxx

échoue avec xxx

Comment on renvoie correctement une chaîne d'une fonction? (Modifier: Ajout des en-têtes pour un extrait de code complet et une typo fixe)


0 commentaires

6 Réponses :


-2
votes

Vous devez inclure sstream et avoir std :: stringstream au lieu de stringstream .


0 commentaires

12
votes

Vous ne pouvez pas retourner un flux d'une fonction par valeur, car cela implique que vous devez copier le flux. Les flux C ++ ne sont pas copieux.


2 commentaires

Je demande peut-être la mauvaise question - mais pourquoi ne puis-je pas copier le flux?


@Hooked, il n'est pas évident que la sémantique des copies de flux serait. Lorsque vous écrivez en une copie, l'écriture devrait-elle également se produire dans l'autre? Lorsque vous fermez un flux, l'autre devient-il aussi proche? Lorsque vous changez de la locale d'un flux, l'autre devait-il changer aussi? Dans les programmes corrects, vous ne devriez pas avoir le besoin de copier un flux.



19
votes

Après corriger le type-o dans le type de retour (noté par Mahesh), votre code ne compilera pas en C ++ 03 car StringStream n'est pas copié. Toutefois, si votre compilateur prend en charge C ++ 0x, en tournant que votre code permet de compiler car Stringstream est MouveConstructible . .


5 commentaires

Je pense que cela ne peut pas compiler même en C ++ 11 sans std :: Déplacer () .


@Petrpervukhin: Pourquoi? Selon 27.8.6 [StringStream.cons], basic_stringstream a un constructeur de déplacement accessible valide qui sera utilisé pour déplacer SS hors foo . Y a-t-il une autre raison pour laquelle vous voyez qui rend le code non valide C ++ 11?


Je peux dire à propos de C ++ 03, que s'il n'y a pas de constructeur de copie dans la classe A, vous ne pouvez pas écrire a = a () , même si le compilateur peut appliquer une élision du constructeur de copie. Donc, je ne suis pas sûr que le compilateur puisse remplacer la construction de la copie avec le déplacement de la construction dans cet exemple.


Excuse-moi. Je l'ai essayé à Coliru, ça marche bien. Donc, ma prochaine question pour Google et sera donc "pourquoi?". =)


@Petrpervukhin: voir Open-Std.org/jtc1/sc22/wg21/docs/papers/2002/... pour la justification.



1
votes

in c ++ 03 Vous devrez transmettre le StringStream comme paramètre par référence non-const ou renvoyer juste la chaîne résultante ( Ss.str () ), comme vous pouvez " t copier le flux.


0 commentaires

3
votes

Bien que cela ne fonctionne pas dans C ++ 03, il devrait fonctionner en C ++ 11. Cependant, les compilateurs actuels peuvent toujours avoir des problèmes (en raison de l'absence de compatibilité complète C ++ 11), par ex. Le code ci-dessus ne compilera pas dans g ++ 4.6.1


0 commentaires

5
votes

Une ancienne question mais je crois que la bonne façon de réaliser ce que vous voulez, c'est d'utiliser le StringStream :: str méthode qui renvoie un objet de chaîne avec une copie du contenu actuel dans la mémoire tampon de flux.

Voici un exemple avec String Str () const; . / p> xxx

qui imprime: xxx


1 commentaires

Un énorme merci à vous aider à résoudre le problème !! :RÉ