Вы не можете разумно делать то, что хотите.
Насколько я понимаю, вам нужен какой-то объект, который настолько неотличим от ::std::istream
, насколько это возможно, но имеет семантику перемещения, так что он будет автоматически уничтожен после того, как он больше не нужен.
Основной полезный атрибут всего, что может упоминаться как ::std::istream
, заключается в том, что оно является производным от ::std::istream
, и, поскольку это ::std::istream
, которое не может быть перемещено, ничто из этого не может быть перемещено либо.
Итак, у вас есть следующая лучшая вещь, ::std::unique_ptr
для вашей ::std::istream
вещи. Это означает, что вам придется использовать *
все время, и это будет ужасно. Ох, хорошо.
Никакая хитрость не позволит вам создать какую-либо оболочку, которая будет одновременно перемещаемой и полученной из ::std::istream
, чтобы она работала со всеми существующими библиотечными функциями, которые этого ожидают. Вы также не можете сделать что-то, что действует каким-либо разумным образом, как ссылка, но эта вещь на самом деле не является ссылкой.
Кстати, когда вы создаете unique_ptr
, вы можете предоставить пользовательское средство удаления, если вы на самом деле указываете на что-то вроде ::std::cin
, которое вы не хотите удалять. Вы можете заставить пользовательское средство удаления просто ничего не делать в этом случае. Пользовательский инструмент удаления будет перемещен вместе с указателем при перемещении unique_ptr
вокруг.