移动派生自 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_ios
,istream
的基 class 包含一个成员函数 void move(basic_ios& _Other)
(用于移动基 class) .
如果在构造函数中使用 std::move(str)
,它会编译!
我正在创建一个带有自定义 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) {}
};
未生成此 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_ios
,istream
的基 class 包含一个成员函数 void move(basic_ios& _Other)
(用于移动基 class) .
如果在构造函数中使用 std::move(str)
,它会编译!