str print mystr funcion biblioteca c++ c++17 move-semantics stringstream rvalue-reference

c++ - print - ¿Por qué no existe `std:: stringstream:: stringstream(std:: string &&)`?



stringstream ss stringstream:: in stringstream:: out); (2)

¿Por qué no existe std::stringstream::stringstream(std::string&&) ?

Esto se debe al búfer interno de std::stringstream , rdbuf .

rdbuf , (escriba std::string_buf ), no admite el acceso sin copia según la motivación en la propuesta, p0408r4 :

... no hay acceso sin copia al búfer interno de un basic_stringbuf que hace que al menos la obtención de los resultados de salida de un ostringstream ineficaz , porque siempre se hace una copia

Sin embargo, ya existe un plan para admitir std::string move en el constructor de stringsteam:

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

Y mueva str()

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

Esperaba que stringstream tuviera un constructor que robara su contenido inicial de una string&& . ¿Tales "constructores de movimiento" entre especies generalmente no existen en el STL? ¿Si no, porque no?


Hay historia, que es decepcionante. Pero también un futuro que luce brillante.

Cuando se movió la semántica en C ++ 11, fue enorme, controvertido y abrumador. Quería poder mover cadenas dentro y fuera de stringstream . Sin embargo, la política en ese momento exigía que la tienda interna no tuviera que ser una basic_string<charT> . Por ejemplo, la tienda interna podría ser un vector . Y no había capacidad para controlar las cosas con un asignador. En cualquier caso, la necesidad fue reconocida en el marco de tiempo de C ++ 11, pero era solo un puente demasiado lejos.

Afortunadamente, Peter Sommerlad se ha recuperado con P0408 . Esta propuesta agrega la funcionalidad que busca, con suerte para C ++ 20, pero eso aún no es seguro. Ha pasado con éxito a través del LEWG, y está en el escritorio del LWG en este momento. No lo lograron este mes en Rapperswil, simplemente por un horario sobrecargado. Tengo la esperanza de que pase por el LWG, y el voto completo del comité. Sin duda tendrá mi voto.