在下面的示例中,我想知道为什么我们通过引用ostream来使用调用。当我删除&但并没有得到错误信息。
class MyArray{
private:
int x[10];
public:
MyArray(int n)
{
for (int i = 0; i < 10; i++)
x[i] = n;
}
friend ostream& operator<<(ostream& pa, MyArray ob);
};
ostream& operator<<(ostream& pa, MyArray ob)
{
for (int i = 0; i < 10; i++)
pa << ob.x[i];
return pa;
}
int main()
{
MyArray a(5);
cout << a;
return 0;
}
答案 0 :(得分:0)
std::ostream
没有“可访问”的移动或复制构造函数。从C ++ 11开始,复制构造函数为deleted
,甚至移动构造函数为protected
。
按值返回时,(即使发生Copy elision,也需要移动/复制构造函数):
ostream operator<<(ostream& pa, MyArray ob){
for (int i = 0; i < 10; i++)
pa << ob.x[i];
return pa; //Move or Copy Constructor is required.
}
.............
std::ostream
应该是执行高级流输出操作的对象的基类。它意味着是控制stream buffer的对象的基类。
复制std::cout
是没有意义的,因为它是一个资源,它被指定来控制一个流缓冲区,负责将字符发送到程序的标准输出。