【发布时间】:2021-01-24 08:13:47
【问题描述】:
This(相当老的)关于 iostreams 和 streambuf 的文章认为,以下代码是可以的:
class DerivedStreamBuf : public std::streambuf {
// ...
};
class DerivedOutputStream : public std::ostream {
public:
DerivedOutputStream():
std::ios(0), std::ostream(&dsb) {} //1
// ...
private:
DerivedStreamBuf dsb;
// ...
};
这可能是有问题的,因为当ostream 被构造时,dsb 尚未初始化,因此 UB 可能是效果。对于析构函数,它可能是相反的:dsb 已经被析构并且可以在ostream 的析构函数中使用。
但是,文章认为,“C++ 标准要求没有父类构造函数或析构函数(ios、istream 或 ostream)访问流缓冲区”。
虽然析构函数的情况很简单,例如对于~ostream:
虚拟~basic_ostream(); 备注:不对rdbuf()进行任何操作。
constructor 不太清楚:
显式 basic_ostream(basic_streambuf
* sb);效果: 用 basic_ios ::init(sb) ([basic.ios.cons])。
这是否意味着这是唯一可能的效果,这个标准公式是否不允许其他效果,它们是 std::ostream 的实现细节并且可能访问未初始化的 dsb?
我的问题:该标准是否保证上述代码是可移植的,即适用于 std::ostream 的所有符合标准的实现?
【问题讨论】:
标签: c++ c++11 language-lawyer