我正在使用自定义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
?
答案 0 :(得分:3)
struct MyIStream : public istream {
MyIStream(MyIStream&& str) : istream(move(str)) {}
};
我收到错误“无效使用void表达式”。
这不起作用,因为basic_ios
,istream
的基类包含成员函数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
}
};