Почему копирование строки не допускается?

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

Я не мог найти причину, почему я не могу скопировать stringstream. не могли бы вы дать некоторую ссылку?

Копирование любого streamа в C ++ отключено, сделав его конструктором private .

Любые средства ЛЮБЫЕ, будь то stringstream , ostream , ostream , iostream или что-то еще.

Копирование streamа отключено, потому что это не имеет смысла. Очень очень важно понять, что означает stream , чтобы понять, почему копирование streamа не имеет смысла. stream не является контейнером, который вы можете сделать. Он не содержит данных.

Если список / вектор / карта или любой контейнер являются ведром, то stream – это шланги, через которые проходят streamи данных. Подумайте о streamе, как о какой-то трубе, через которую вы получаете данные; труба – с одной стороны – источник (отправитель), с другой стороны – приемник (приемник). Это называется однонаправленным streamом. Существуют также двунаправленные streamи, через которые поступают данные в обоих направлениях. Так что же это значит сделать копию такого? Он не содержит никаких данных. Именно через это вы получаете данные.

Предположим, что некоторое время, если сделать копию streamа разрешено, и вы создали копию std::cin которая на самом деле является входным streamом. Скажем, скопированный объект – copy_cin . Теперь спросите себя: имеет ли смысл читать данные из streamа copy_cin когда те же самые данные уже были прочитаны из std::cin. Нет, это не имеет смысла, поскольку пользователь вводил данные только один раз, клавиатура (или устройство ввода) генерировала электрические сигналы только один раз, и они протекали через все другие аппаратные средства и API низкого уровня только один раз. Как ваша программа может прочитать это дважды или более ?

Следовательно, создание копии не допускается, но создание ссылки разрешено:

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

Также обратите внимание, что вы можете создать еще один экземпляр streamа и можете использовать его в том же базовом буфере, который использует старый stream. Смотрите это: https://ideone.com/rijov

Чтобы напрямую ответить на вопрос, вы не можете скопировать, потому что конструктор копирования для classа stringstream объявлен как закрытый.

Вероятно, это было объявлено так, потому что в большинстве случаев кажется неудобным копировать stream, поэтому ни один из classов streamов не имеет публичных конструкторов копий.

Как уже упоминалось выше, вы не можете копировать stream, но если вам нужно, вы можете скопировать данные:

 std::stringstream from; std::stringstream to; std::copy(std::istream_iterator(from), std::istream_iterator(), std::ostream_iterator(to)); 
Давайте будем гением компьютера.