关于函数返回类类型可否作为左值
#include<iostream>
#include<ostream>
#include<string>
using namespace std;
class A
{
friend ostream& operator<<(ostream& out, const A & a)
{
out<<a.str;
return out;
}
public:
string str;
A(string s):str(s){}
A& operator=(const A&);
A& operator+=(const A&a)
{
this->str+=a.str;
return *this;
}
};
A operator +(const A& lhs,const A& rhs)
{
A temp(lhs.str);
temp+=rhs;
return temp;
}
A& A::operator =(const A&a)
{
this->str=a.str;
return *this;
}
void main()
{
A a("hello_");
A aa("world");
cout<<a+aa<<endl;
}
以上是一个类A,其只有一个数据成员为std::string类型的str,该类重载了运算符+ += = 以及<< 其中+的返回值为A型的值,现在看下主函数定义了两个A的实例a和aa,a+aa返回一个A的值,并被输出。程序没什么大问题,输出结果是:hello_world。
随后突发奇想,把主函数改成:
void main()
{
A a("hello_");
A aa("world");
a+aa=a;
} 结果编译竟然通过,也就是说返回的A值竟然可以被赋值,那么到底算不算左值呢?
然后就做了个实验:
void main()
{
int i=7;
&(i++);
} 这时报错说&需要一个左值,(i++返回的是一个值而不是引用),于是我试了一下&(a+aa)结果编译通过,也就是说a+aa的返回值是一个左值。
可是为什么呢?明明返回的就只是一个A型的值,却能够当左值用?
下面是main方法 大家看看运行后会输出啥?再跟之前的第一个main方法对比下
void main()
{
A a("hello_");
A aa("world");
A* pa = &(a+aa);
cout<<(*pa)<<endl;
} 这里的输出是:
谁能解释一下为什么输出是空呢?? 好困惑。。