Raj*_*jat 8 c++ reference operator-overloading stream
如果我不返回会发生什么,din或者dout实际上我正在读一本书,其中作者返回流引用
istream & operator>>(istream &din,vector &a)
{
    for(int i=0;i<size;i++)
    din>>a.v[i];
    return din;
}
ostream & operator<<(ostream &dout,vector &a)
{
    dout<<"("<<a.v[0];
    for(int i=1;i<size;i++)
    dout<<", "<<a.v[i];
    dout<<")";
    return dout;
}
原因是多个事实的结合。
您希望能够像这样链接输入和输出操作
in  >> x >> y;
out << z << std::precision(10) << t << std::endl;
因此您必须返回允许的东西operator<<。
由于您希望操作员处理任何istream,即从派生的任何对象std::istream,因此无法定义
operator<<(istream_type, object);    // take istream by value
因为这仅适用于特定的istream类型istream_type,但不适用于通用类型istream。为此,必须使用多态性,即采用引用或指针(将是从派生的类的引用或指针std::istream)。
由于您仅具有对istream的引用,因此无法返回istream对象本身(它的类型可能甚至在的定义点都没有定义operator<<),而是仅返回您已获得的引用。
可以通过定义operator<<a template并接受并返回istream_typeby值来克服这种限制,但这需要该istream类型具有一个复制构造函数,出于充分的原因,它可能没有。
为了激发多态性,原则上可以使用指针(指向流)而不是引用。但是,operator<<(stream*,const char*)在C ++中是不允许的(至少一个操作数必须是类或枚举类型)。
因此,对于流指针,必须使用函数调用语法,而您将返回C-style fprintf(stream*, args...)。
此外,指针可以为null或悬空,这实际上是它们的默认状态(在没有初始化程序的情况下声明),而可以假定引用是有效的(在没有初始化程序的情况下不能声明)。
在这种情况下,当返回引用时,您可以将运算符组合在链中。例如
std::cout << "Hello " << "Rajat Verma";
这相当于操作员的以下调用
operator <<( operator <<( std::cout, "Hello" ), "Rajat Verma" );
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              returns reference to std::cout