移动从istream派生的类

时间:2016-09-08 15:10:25

标签: c++ c++11 move istream

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

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) {}
};

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

  

使用已删除的函数'std :: basic_ios&lt; _CharT,_Traits&gt; :: basic_ios(const std :: basic_ios&lt; _CharT,_Traits&gt;&amp;)[with _CharT = char; _Traits = std :: char_traits]'

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

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

我收到错误“无效使用void表达式”。 (在最后一种情况下,我可能会做些傻事,但我无法发现......)

如何创建可移动的istream

2 个答案:

答案 0 :(得分:3)

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

我收到错误“无效使用void表达式”。

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

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

答案 1 :(得分:1)

  

如何创建可移动的istream?

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

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