重载输出流运算符<<时,为什么只能输出单个变量的值,而不能输出表达式的值?
原理是什么?
#include <bits/stdc++.h>
using namespace std;
#define N 1000
struct Point
{
int x, y;
Point(){}
Point(int a, int b):x(a),y(b){}
Point operator + (Point &b)
{
return Point(x+b.x, y+b.y);
}
friend ostream& operator << (ostream& os, Point &p)
{
os<<"("<<p.x<<','<<p.y<<")";
return os;
}
};
int main()
{
Point p(1,2), q(3,4), r;
cout << p << ' ' << q << endl;
r = p + q;
cout << r << endl;
//以上编译都过了 能正常运行
cout << (p+q); //这行写编译不过, 请问为什么?
//报错:[Error] cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
return 0;
}
+运算返回的是一个临时变量,p+q返回的是一个临时变量,<<重载运算符中用引用的时候(也就是用Point &p的时候),是对这个临时变量的引用,但是这个临时变量在+运算符重载函数结束后就被回收了,所以,如果<<中用引用的时候,引用指向了一个被销毁的对象,所以会报错。
把13行Point &p改为Point p,就能过了。
请问原理是什么?p+q返回的到底是什么类型的东西?为什么传值可以,传引用就不行?