移动派生自 istream 的 class

Moving a class derived from istream

我正在创建一个带有自定义 streambuf 的 C++ istream。尝试移动它失败,因为 istream 移动构造函数受到保护。为了解决这个问题,我从 istream:

派生了一个 class
struct VectorCharBuf : public streambuf {
    VectorCharBuf(vector<char>& v) {
        setg(v.data(), v.data(), v.data() + v.size());
    }
};

struct IVectorCharStream : public istream {
    IVectorCharStream(VectorCharBuf* contents_buf) : istream(contents_buf) {}
};

未生成此 class 的默认移动构造函数,因为它涉及

use of deleted function 'std::basic_ios<_CharT, _Traits>::basic_ios(const std::basic_ios<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits]'

此外,如果我尝试显式声明移动构造函数,如

struct MyIStream : public istream {
    MyIStream(MyIStream&& str) : istream(move(str)) {}
};

我收到一个错误 "invalid use of void expression"。 (在最后一个案例中我可能做了一些愚蠢的事情,但我就是无法发现它......)

如何创建可移动的istream

How can I create a movable istream?

您可以根据基 class 的默认构造函数而不是基的移动构造函数来实现 class:

struct MyIStream : public istream {
    MyIStream(MyIStream&& str)
   : istream()
   {
       // todo: implement move functionality from str
   }
};
struct MyIStream : public istream {
    MyIStream(MyIStream&& str) : istream(move(str)) {}
};

I get an error "invalid use of void expression".

这不起作用,因为 basic_iosistream 的基 class 包含一个成员函数 void move(basic_ios& _Other)(用于移动基 class) .

如果在构造函数中使用 std::move(str),它会编译!