К сожалению, вы не можете скопировать (или даже переместить) абстрактный тип потока std::istream
. Вы можете хранить их по ссылке, но это не похоже на то, что хочет сделать ваш код.
Когда вы передаете std::ifstream
, я предполагаю, что это тип потока, с которым вы действительно хотите иметь дело. В отличие от std::istream
, std::ifstream
является конкретным типом. И этот тип является подвижным, но не копируемым.
Ответ hmjd, и то, что вы отметили правильно, - лучший способ закодировать это:
#include <fstream>
class foo
{
std::ifstream input;
public:
foo(std::ifstream&& in): input(std::move(in)) { }
};
Объяснение: Конструктор foo
будет принимать только значение std::ifstream
s, что является правильным. Но как только вы попадете внутрь этого конструктора, переменная in
больше не будет значением r (это значение l). И поэтому вам нужно привести его обратно к r-значению (используя std::move
), чтобы переместить конструкцию элемента данных input
.
Это тот же шаблон, который вы использовали бы с любым типом только для перемещения (stringstream
, unique_ptr
, future
, unique_lock
и т. Д.).