先了解引用的作用:C++引用的作用_Lao_tan的博客-CSDN博客_c++引用的作用
右值引用_百度百科
C++中rvalue和lvalue详悉_Naruto_Q的博客-CSDN博客_lvalue rvalue
lvalue(left value)、rvalue(right value)是c语言编译过程中的用于描述等号左右值的符号。但是不能直观的通过在等号左边还是右边来判断是lvalue还是rvalue。能够取地址的,有名字的就是左值;反之,不能取地址,没有名字的就是右值。
左值(lvalue)可以是明确的变量。右值(rvalue)可以是临时变量,比如表达式、函数返回值、常量等。
int a = 1;
int b;//下面为左值引用
int &aa0 = a;//ture
int &bb0 = b;//ture
int &aa1 =1;//error
int &aa1 = a+1;//error//下面为右值引用
int &&a1 = a;//error
int &&b1 = b;//error
int &&a2 = 1;//ture
int &&a3 = a+1;//ture
int &&a4 = std::move(a);//ture ,std::move()强制将左值转换成右值
//可以通过这个函数来判断是lvalue还是rvalue。
bool is_r_value(int &&)
{
return true;
}
bool is_r_value(const int &)
{
return false;
}
可以将C++的引用理解为指针常量。引用必须在声明时初始化,声明之外的赋值操作都是对引用所代指地址的内容访问。
C++参数中的& 和&& 都表示引用。左值的引用(lvalue)声明符号为”&”, 为了和左值区分,右值的引用(rvalue)声明符号为”&&”。 右值引用初始化之后引用本身变成了lvalue。所以无法进行“&&=&&”,从而达到右值引用传递的目的;但是左值引用可以传递,所以可以进行“&=&”。引用初始化必须满足lvalue = lvalue或者rvalue = rvalue。
不同编辑器表现可能会有差异。比如vs中对类或结构体操作时不一定非要满足lvalue = lvalue或者rvalue = rvalue的原则。
static int t = 0;
class Whore {
public:
char buf[10];
Whore()
{
itoa(t++,buf,10);
cout << "Whore():" << buf<< endl;
}
~Whore()
{
cout << "~Whore():"<
C++临时变量的生命周期_snail0428的博客-CSDN博客_临时变量生命周期
【C++】拷贝构造函数的调用时机_翼同学的博客-CSDN博客_c++拷贝构造函数什么时候调用
返回引用的意义_陈小淘的博客-CSDN博客_函数返回引用的含义
C++将返回值为引用有什么作用? - 知乎
(右值)引用可以改变临时变量的生命周期!!!函数返回类型绝对不能返回右值引用:T &&,返回右值引用再逻辑上不成立,且会造成非法越界访问。返回的左值引用也可能会造成越界访问,需要理解清楚左值引用所引用对象的生命周期。
static int t = 0;
class Whore {
public:
char nickname[10];
Whore()
{
_itoa(t++,buf,10);
cout << "Whore():"<< nickname << endl;
}
Whore(Whore & w)
{
char buf[10];
nickname = _itoa(t++, buf, 10);
cout << "Whore(Whore & w):" << nickname << endl;
}
~Whore()
{
cout << "~Whore():"<



