C++11增加了一个新的类型,称为右值引用(R-value reference),标记为&&,
左值:存储在内存中、有明确存储地址(可取地址)的数据;
右值:可以提供数据值的数据()不可取地址。
区别:可以使用&取地址的是左值,不能取地址的是右值。
int a = 520;
int b = 1314;
a = b;
一般情况下=左边是左值,=右边是右值,上面前两行,a,b都是左值,520,1314是右值;但是a=b是一种特殊情况,在这个表达式中,a,b都是左值。
非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和 lambda 表达式等;
这里先简单举个例子:
(1)字面量
int x = 42; // 42 是一个纯右值值
int y = 5 + 10; // 5 + 10 是一个纯右值值
(2)表达式结果
算术运算结果
int sum = 2 + 3; // 2 + 3 是一个纯右值值
函数调用结果
int multiply(int a, int b)
{
return a * b;
}
int result = multiply(4, 5); // multiply(4, 5) 是一个纯右值值
int getValue() {
return 42; //42是纯右值
}
(3)匿名对象
创建匿名对象并将其作为函数参数传递:
void foo(std::string&& str)
{
//todo
}
foo(std::string("hello")) //std::string("hello")是一个匿名对象,被传递作为纯右值值
(1)临时对象
创建临时对象并将其作为函数参数传递:
void foo(std:: string&& str)
{
//todo
}
foo("hello"); //"hello" 是一个临时字符串对象,被传递作为将亡值
使用临时对象初始化其他对象:
std::string&& str = std::string("hello"); //”hello“是一个临时字符串对象,被用作将亡值初始化 str
(2)右值引用声名
声名和使用右值来标识将亡值:
int&& x = 5; //5是将亡值,通过右值引用x进行引用
返回值引用:
int&& getValue()
{
return 42; //返回将亡值
}