Clairement, il me manque quelque chose d'important sur les stringstreams en général ici, mais quelqu'un pourrait-il expliquer pourquoi échoue avec p> 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) p> p>
6 Réponses :
Vous devez inclure sstream code> et avoir
std :: stringstream code> au lieu de
stringstream code>. p>
Vous ne pouvez pas retourner un flux d'une fonction par valeur, car cela implique que vous devez copier em> le flux. Les flux C ++ ne sont pas copieux. P>
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 i> de copier un flux.
Après corriger le type-o dans le type de retour (noté par Mahesh), votre code ne compilera pas en C ++ 03 car StringStream code> n'est pas copié. Toutefois, si votre compilateur prend en charge C ++ 0x, en tournant que votre code permet de compiler car
Stringstream code> est
MouveConstructible code>. P>.
Je pense que cela ne peut pas compiler même en C ++ 11 sans std :: Déplacer () code>.
@Petrpervukhin: Pourquoi? Selon 27.8.6 [StringStream.cons], code> basic_stringstream code> a un constructeur de déplacement accessible valide qui sera utilisé pour déplacer SS code> hors
foo code> . 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 () code>, 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.
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 () code>), comme vous pouvez " t copier le flux. P>
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 p>
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 qui imprime: p> String Str () const; code>. / p>
Un énorme merci à vous aider à résoudre le problème !! :RÉ