C++11增加了一个新的类型,称为右值引用(R-value-reference),标记为T&&。
1. 左值和右值
左值:表达式结束之后依然存在的持久对象(具名,能取地址)。
右值:表达式结束时就不能再存在的临时对象(不具名,不能取地址,右值具名后就成了左值)。
右值由两个概念组成:
- 将亡值:新增的、与右值引用相关的表达式,将要被移动的对象,T&&函数返回值、std::move返回值和转换为T&&类型的转换函数的返回值。
- 纯右值:比如非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和lambda表达式。
注意: - 字符串字面值是左值。
- ++i是左值,i++是右值(纯右值)。
- 具名的右值引用是左值,不具名的右值引用是右值。
template<class T>
void test(T&& x)
{
std::cout << "Rvalue" std:: << endl;
}
template<class K>
void test(K& x)
{
std::cout << "Lvalue" << std::endl;
}
int main()
{
test("asd"); //输出Lvalue
return 0;
}