【7】c++11新特性 —>右值引用(1)

右值引用

1.1右值

C++11增加了一个新的类型,称为右值引用(R-value reference),标记为&&,
左值:存储在内存中、有明确存储地址(可取地址)的数据;
右值:可以提供数据值的数据()不可取地址。
区别:可以使用&取地址的是左值,不能取地址的是右值。

int a = 520;
int b = 1314;
a = b;

一般情况下=左边是左值,=右边是右值,上面前两行,a,b都是左值,520,1314是右值;但是a=b是一种特殊情况,在这个表达式中,a,b都是左值。

1.2 右值分类(两类)

纯右值

非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和 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; //返回将亡值 
}

你可能感兴趣的:(c++11新特性,c++,开发语言)