C++左值、右值及引述

C++左值、右值及引用
小弟在学习C++lvalue,rvalue引用中遇到一困惑,如下
#include<iostream>
#include"stdlib.h"
using namespace std;
class Cmessage
{
private:
char* pmessage;
public:
Cmessage(const char* text = "default message.")
{
pmessage = new char[strlen(text)+1];
strcpy(pmessage,text);
cout<<"instructor."<<endl;
}
~Cmessage()
{
delete []pmessage;
cout<<"destructor."<<endl;
}
void showit()
{
cout<<pmessage<<endl;
}
Cmessage(Cmessage& amess)
{
pmessage = amess.pmessage;
amess.pmessage = NULL;
cout<<"fuzhigouzao."<<endl;
}
Cmessage& operator=(Cmessage& amess)
{
if(this->pmessage==amess.pmessage)
return *this;
delete [] pmessage;
this->pmessage = amess.pmessage;
amess.pmessage = NULL;
cout<<"overload ="<<endl;
return *this;
}
Cmessage operator+(const Cmessage& amess)const
{
cout<<"overload +"<<endl;
size_t len = strlen(this->pmessage)+strlen(amess.pmessage)+1;
Cmessage message;
message.pmessage = new char[len];
strcpy(message.pmessage,this->pmessage);
strcat(message.pmessage,amess.pmessage);
return message;
}
};
int main()
{
Cmessage text1("text1 message.");
Cmessage text2("text2 message.\n");
Cmessage text3;
cout<<"text3 = text1+text2"<<endl;
text3 = text1+text2; //**************//
text3.showit();
return 0;
}

如上,注释处的赋值为什么还能调用text3.operator=()呢?text1+text2返回值不是应当是右值吗?text3.operator=()的形参是左值引用啊。这里为什么不报错呢?运行结果如下:
instructor.
instructor.
instructor.
text3 = text1+text2
overload +
instructor.
fuzhigouzao.
destructor.
overload =
destructor.
text1 message.text2 message.

destructor.
destructor.
destructor.
引用 lvalue rvalue

------解决方案--------------------
引用:
引用:引用:so easy  的问题。。。加出来的结果它也是一个左值。
class A
{
...
};
A a1,a2;
***.operator=(a1+a2);
这一行翻译过来就是,把a2加到a1上,加之前,a1是左值,a2是右值 加完依然是个左值。
或者你可以写一个函……


这个你说错了,operator+以后,在里面创建的对象已经消失了,返回的是一个值。这时候调用 复制构造函数 新建了一个对象,这个对象再被 operator=调用的!
不信你运行一下试试,这边多一个  复制构造函数 创建的对象的
------解决方案--------------------
是的,也会多析构一次的。返回的还是一个临时对象,不过不是原来这个对象。原来的对象是在函数内的栈上的空间,这个返回的我就不知道在哪段空间了,理论上应该是在调用函数的栈空间里,我没跟汇编码。