使用nullptr作为streambuf默认初始化std::istream是否符合C++标准?
C++ 自定义流相关问题解答
问题1:将nullptr作为streambuf传入以默认初始化std::istream的操作是否合法有效?
该操作是完全合法有效的。
std::istream的公开构造函数签名为explicit istream(streambuf* sb);,允许接收nullptr作为参数- 构造完成后流会初始设置
failbit状态位,暂时无法执行IO操作,但流对象本身是合法可访问的,后续可以通过set_rdbuf更换关联的streambuf后正常使用
问题2:如下代码是否符合C++标准规范?
class MyIstream : std::istream { MyStreamBuf buf; public: MyIstream(): std::istream(nullptr) { set_rdbuf(&buf); } };
除了类定义末尾缺少分号的语法小问题外,代码完全符合C++标准,是自定义输入流的标准实现范式:
- 初始化列表中给基类传入
nullptr的操作合法 - 成员初始化顺序符合C++类初始化规则:先初始化基类
std::istream,再初始化派生类的buf成员,进入构造函数体时buf已经完成构造,此时调用set_rdbuf(&buf)不会出现悬挂指针问题 - 建议在构造函数中
set_rdbuf后补充调用clear(),清除初始化基类时设置的failbit状态,构造完成即可直接使用流
问题3:是否需要创建MyDummyStreamBuf,来绕过std::istream没有默认构造函数的限制?
完全不需要额外实现DummyStreamBuf。
你当前的写法已经是C++标准推荐的自定义流实现方式,传入nullptr初始化基类的操作完全合法,没有违反任何规范,额外增加DummyStreamBuf只会引入不必要的代码冗余和运行时开销。
内容的提问来源于stack exchange,提问作者yrHeTateJlb
相关产品推荐
相关产品推荐

