在C++中,流操作符(»)是经常要被重载的,一般的形式是这样的:

       class CObj
       {
            ...
       };
       std::ostream& operator << (std::ostream& strm, const CObj& objA)
       {
            ...
            return strm;
       }

  我们经常使用流的引用,而不是直接把一个流作为值传送,原因主要考虑到流是一种资源,如果作为值传送,出现了对资源的复制,释放的时候很麻烦,而且可能出现两个流同时操作一个文件的情况。但是这个原因只能说是我们用流作为引用而不是值传送的一个逻辑或性能限制,不是语法限制,也就是说,我们是可以硬把流作为一个值传送过来的。

  也就是说,我们实际上可以这样写的:

       class CObj
       {
            ...
       };
       std::ostream operator << (std::ostream strm, const CObj& objA)
       {
            ...
            return strm;
       }

  但是这样写了以后,编译器(Visual C++ 7.0)会报告编译时错误,类型不匹配。为什么会这样?难道是语法上有限制吗?

  事实上是语法上并没有这样的限制说重载流符号的时候一定要用引用方式来传递流,事实上是,我们在传递参数的任何时候都必须用引用方式传递流,或者指针(这就和引用没区别了),原因在于:流的类体系结构中,不管是哪个流,都只有一个接收指针作为参数而且没有用explicit声明拷贝构造函数,也就是说,所有的流,都没有提供可以用另外一个流作为值传送参数的拷贝构造函数。这是不使用引用传送流引起语法错误的原因。

  如果我们使用值传送来传递一个流给函数,那么在函数里要生成一个该流的临时变量,生成临时变量的时候,就要调用对应的拷贝构造函数,并且这个拷贝构造函数必须是以一个值传送的流作为参数的——但是流就是没有这样的拷贝构造函数。

  结果,编译时错误就产生了!

[原文在百度空间已经关闭]