右值引用&完美转发
一、右值引用
1。右值、左值
-
C++ 中表达式分为左值和右值,简单而言,有内存地址的表达式就是左值,它可以出现在赋值语句的左边或者右边。无法取内存地址的表达式是右值,只能出现在赋值语句的右边。
-
左值 (lvalue, left value),顾名思义就是赋值符号左边的值。准确来说, 左值是表达式(不一定是赋值表达式)后依然存在的持久对象。
-
右值 (rvalue, right value),右边的值,是指表达式结束后就不再存在的临时对象。
void RValue()
{
//auto pos_num = &(10); // 不能取地址 1. 常量字面量
auto pos_char = &("123456"); // "123456" 类型为 const char [7],因此是左值
//auto pos_funA = &(funcA(0x1111)); // 不能取地址 2. 函数调用的返回值
auto pos_funB = &(funcB(0x2222)); // 函数调用返回的类型为左值引用,则返回的结果为左值
//auto pos_class = &(A()); //不能取地址 3. 无名对象
}
-
纯右值 (prvalue, pure rvalue),纯粹的右值,要么是纯粹的字面量,例如 10, true; 要么是求值结果相当于字面量或匿名临时对象,例如 1+2。非引用返回的临时变量、运算表达式产生的临时变量、 原始字面量、Lambda 表达式都属于纯右值。
-
将亡值 (xvalue, expiring value),是 C++11 为了引入右值引用而提出的概念(因此在传统 C++ 中, 纯右值和右值是同一个概念),也就是即将被销毁、却能够被移动的值。
2.右值引用、左值引用
- 在 C++11 之前,是只有左值引用(C++11之后,为了和右值引用区分,原来的“引用”才称为“左值引用”),没有右值引用的。因此无法用非 const (左值)引用匹配右值的