47 votes

Pourquoi `std::stringstream::stringstream(std::string&&)` n'existe-t-il pas ?

J'espérais que stringstream a un constructeur qui vole son contenu initial à partir d'un fichier string&& . De tels "constructeurs de déplacement" inter-espèces n'existent-ils généralement pas dans la STL ? Si ce n'est pas le cas, pourquoi ?

6 votes

Dans le même ordre d'idées, pourquoi les .str(string&&) existent ?

55voto

Howard Hinnant Points 59526

Il y a l'histoire, ce qui est décevant. Mais aussi un avenir qui s'annonce radieux.

Lorsque la sémantique des déplacements a été introduite dans C++11, elle a été énorme, controversée et écrasante. Je voulais pouvoir déplacer des chaînes de caractères en et hors de stringstream . Cependant, la politique de l'époque exigeait que le magasin interne ne soit pas avoir d'être un basic_string<charT> . Par exemple, le magasin interne peut être un vector . Et il n'était pas possible de contrôler les choses à l'aide d'un allocateur. Quoi qu'il en soit, le besoin a été reconnu à l'époque de C++11, mais c'était un pont trop loin.

Heureusement, Peter Sommerlad a pris le relais avec P0408 . Cette proposition ajoute la fonctionnalité que vous recherchez, avec un peu de chance pour le C++20, mais ce n'est pas encore certain. Elle est passée avec succès par le LEWG et se trouve actuellement sur le bureau du LWG. Il n'a pas été examiné ce mois-ci à Rapperswil, uniquement en raison d'un emploi du temps surchargé. J'espère qu'il passera par le GTL et qu'il sera soumis au vote de l'ensemble de la commission. Mon vote sera certainement acquis.

0 votes

Même si le magasin interne était ésotérique, les constructeurs de mouvements auraient peut-être pu être spécifiés comme ayant un coût O(1) ou O(n), défini par l'implémentation ? Il s'agit bien sûr d'une hypothèse sans intérêt, mais cette idée est-elle au moins valable rétrospectivement ?

1 votes

Absolument. Je n'avais plus le vent en poupe. Il y avait ce problème, des problèmes avec les algorithmes numériques (qui ont également été corrigés), et probablement d'autres (oh oui, les algorithmes non initialisés). D'un côté, j'aurais aimé pouvoir tout "déplacer". D'autre part, il est gratifiant de constater que les gens considèrent cette fonctionnalité comme suffisamment importante pour y travailler eux-mêmes.

0 votes

Je comprends tout à fait qu'il n'y ait pas de vent :) Merci pour ce petit bout d'histoire !

12voto

codekaizer Points 4295

Pourquoi les std::stringstream::stringstream(std::string&&) existent ?

Ceci est dû à std::stringstream dans la mémoire tampon interne de l'entreprise, rdbuf .

rdbuf , (type std::string_buf ), ne prend pas en charge les non-copie accès selon la motivation de la proposition, p0408r4 :

... il y a non sans copie accès à la mémoire tampon interne basic_stringbuf ce qui permet au moins d'obtenir résulte d'une ostringstream inefficace car un c effectuée

Cependant, il existe déjà un plan de soutien aux std::string dans le constructeur de stringsteam :

explicit basic_ostringstream(
   basic_string<charT, traits, Allocator>&& str,
   ios_base::openmode which = ios_base::out,
   const Allocator& a = Allocator());

ET se déplacer str()

template<class SAlloc = Allocator>
void str(basic_string<charT, traits, SAlloc>&& s);

0 votes

@NicolBolas, permettez-moi de mettre à jour mon post sur la base de p0408r1 . Nous vous remercions de votre attention.

3 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X