¿Por qué no se permite copiar secuencias de cadenas?

int main() { std::stringstream s1("This is my string."); std::stringstream s2 = s1; // error, copying not allowed } 

No pude encontrar una razón de por qué no puedo copiar el flujo de cadenas. podrías darnos alguna referencia?

La copia de CUALQUIER secuencia en C ++ se desactiva haciendo que el constructor de copia sea private .

Cualquiera significa CUALQUIERA, ya sea stringstream , istream , istream , iostream o lo que sea.

La copia de la transmisión está deshabilitada porque no tiene sentido. Es muy, muy, muy importante entender lo que significa la stream , para entender realmente por qué copiar la transmisión no tiene sentido. stream no es un contenedor del que puedes hacer una copia. No contiene datos.

Si una lista / vector / mapa o cualquier contenedor es una cubeta, la transmisión es una manguera a través de la cual fluyen los datos. Piensa en stream como una tubería a través de la cual obtienes datos; una tubería – en un lado está la fuente (emisor), en el otro lado está el receptor (receptor). Eso se llama stream unidireccional. También hay flujos bidireccionales a través de los cuales los datos fluyen en ambas direcciones. Entonces, ¿qué tiene sentido hacer una copia de tal cosa? No contiene ningún dato en absoluto. Es a través del cual obtienes datos.

Ahora supongamos por un tiempo si se permite hacer una copia de la transmisión, y usted creó una copia de std::cin que en realidad es una transmisión de entrada. Digamos que el objeto copiado es copy_cin . Ahora pregúntese: ¿tiene sentido leer datos de la stream copy_cin cuando ya se han leído los mismos datos de std::cin. No, no tiene sentido, porque el usuario ingresó los datos solo una vez, el teclado (o el dispositivo de entrada) generó las señales eléctricas solo una vez y fluyeron a través de todos los otros hardwares y API de bajo nivel solo una vez. ¿Cómo puede su progtwig leerlo dos veces o más ?

Por lo tanto, no se permite la creación de copias , pero se permite la creación de referencias :

 std::istream copy_cin = std::cin; //error std::istream & ref_cin = std::cin; //ok 

También tenga en cuenta que puede crear otra instancia de transmisión y hacer que utilice el mismo almacenamiento intermedio subyacente que la transmisión anterior está utilizando actualmente. Mira esto: https://ideone.com/rijov

Para responder directamente a la pregunta, no puede copiar porque el constructor de copia para la clase de cadena de caracteres se declara como privado.

Probablemente fue declarado de esa manera porque parece incómodo copiar una secuencia en la mayoría de los casos, por lo que ninguna de las clases de flujo tiene constructores de copia públicas.

Como se mencionó anteriormente, no puede copiar el flujo, pero si lo necesita, puede copiar los datos:

 std::stringstream from; std::stringstream to; std::copy(std::istream_iterator(from), std::istream_iterator(), std::ostream_iterator(to));