繁体   English   中英

为什么从C ++ I / O系统中删除iostream_withassign,ostream_withassign和istream_withassign类?

[英]Why were the iostream_withassign, ostream_withassign & istream_withassign classes removed from the C++ I/O system?

在C ++ 98之前,在C ++ I / O类层次结构中,存在3个名为iostream_withassign, ostream_withassignistream_withassign

iostream_withassign类的成员函数:

构造函数与析构函数

〜iostream_withassign

public:virtual ~iostream_withassign()

iostream_withassign

public:iostream_withassign()

创建一个iostream_withassign对象。 它不会对此对象进行任何初始化。

运算子=

public:iostream_withassign& operator =(iostream_withassign& rhs)

分配运算符operator =

过载1

public:iostream_withassign& operator =(streambuf*)

该分配运算符获取指向streambuf对象的指针,并将该streambuf对象与该赋值运算符左侧的iostream_withassign对象相关联。

过载2

public:iostream_withassign& operator =(ios&)

该赋值运算符采用对ios对象的左值引用,并将附加到此ios对象的流缓冲区与在赋值运算符左侧的iostream_withassign对象相关联。

资料来源: this

原路说:

ostream_withassign类是ostream的一种变体,它允许对象分配。 预定义的对象cout,cerr和clog是此类的对象,因此可以在运行时重新分配给其他ostream对象。 例如,可以将通常将输出发送到stdout的程序临时定向,以将其输出发送到磁盘文件。 它还包含构造函数,析构函数和=(assignment)运算符函数。

我不明白,为什么这些类存在? 这3个类有什么用吗? 为什么稍后将这3个类从C ++ 98标准中删除? 是什么原因?

另请参见C ++流类层次结构。 它没有这3个类。

C ++ I / O类层次结构

他们被发现不足。 它们被替换为:

  1. iostate rdstate()读取流状态。
  2. void clear(iostate state = goodbit)设置流状态。
  3. basic_streambuf<class charT, class Traits>* rdbuf()以检索流缓冲区。
  4. basic_streambuf<class charT, class Traits>* rdbuf(basic_streambuf<class charT, class Traits>* sb)设置流缓冲区。
  5. basic_ios<class charT, class Traits>& copyfmt(basic_ios<class charT, class Traits>& rhs)设置basic_ios<class charT, class Traits>& copyfmt(basic_ios<class charT, class Traits>& rhs)所有其他数据成员。

_withassign类有什么问题?

一致性。 由于认为不复制C ++ 98标准I / O流,因此首先将相关操作设为private (直到C ++ 11),然后再显式delete -ing它们。

在C ++中,处理资源的方式很重要,因为您可以决定专有或共享它,而在其他语言中,您不能并且需要习惯于所选择的一种语言。 两种版本都破坏了一致性(这是委婉的说法)。 这是违反直觉的。

而且,严格来说, *_withassign包装器并不会增加iostream无法做到的东西。


例如,可以将通常将输出发送到stdout的程序临时定向,以将其输出发送到磁盘文件。 它还包含构造函数,析构函数和=(assignment)运算符函数。

例如,您可以使用rdbuf来获取流当前正在使用的基础std::basic_streambuf ,并提供另一个流,该流是由另一种标准流获得的,或者是您通过继承自std::basic_streambuf类(如std::basic_filebuf编写的。

您可以轻松实现以下目标:

std::ofstream ofs{path};
auto oldbuf = cout.rdbuf( ofs.rdbuf() );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM