关于函数返回类类型可否作为左值

#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;
}   这里的输出是:                                

   

谁能解释一下为什么输出是空呢??           好困惑。。

posted on 2012-06-17 21:25  cs_jin_scor  阅读(948)  评论(4编辑  收藏  举报