【发布时间】:2017-01-16 14:21:15
【问题描述】:
我正在使用自定义 streambuf 创建 C++ istream。尝试移动它失败,因为 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<_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)) {}
};
我收到“无效使用无效表达式”错误。 (在最后一种情况下,我可能在做一些愚蠢的事情,但我无法发现它......。)
如何创建可移动的istream?
【问题讨论】:
-
你为什么首先尝试移动一个实际的
std::istream?这听起来没什么用。 -
@BaummitAugen,所以你可以使用
auto variable = MyIstream{};来初始化它? -
那你打算怎么处理
variable?std::istream只是一个通用的基础,它本身实际上并没有做任何有用的事情。 -
@BaummitAugen:如果您提供自定义 streambuf,
std::istream很有用。不过,我很高兴能够移动源自istream的流。 -
啊,我明白了。那就继续吧。