C++11——右值引用
2017-04-11 12:22
190 查看
C++中的引用允许你为以及存在的对象创建一个新的名字。对新引用所做的访问和修改操作,都会影响到它的原型(被引用的对象)。
例如:
这种方式被称为左值引用——对左值的引用。左值这个概念来源与C语言,指的是可以放在赋值表达式左边的事物——在栈上或堆上分配的命名对象,或者其它有明确的内存地址的对象成员。右值这个概念也来自C语言,值的是可以出现在赋值表达式右侧的对象——例如,文字常量和临时变量。因此,左值引用只能被绑定在左值上,而不是右值。
例如下面这样写是错的:
但是你可以使用下面的这种方式来对一个右值进行引用:
i是一个const左值,之所以可以这样写,是因为发生了隐式转换。就像我们可以对左值的const引用创建临时性的对象,并将其作为参数传递给函数。比如:
在C++11标准中介绍了右值引用(rvalue reference),这种方式只能绑定右值,不能绑定左值,它通过两个&&来进行声明:
因此可以通过函数重载的方式来确定:函数有左值或右值为参数的时候,看是否能被同名且对应参数为左值或有值引用的函数所重载。
例如:
int var = 2; int& ref = var; ref = 9; // ref = 9; // var = 9;
这种方式被称为左值引用——对左值的引用。左值这个概念来源与C语言,指的是可以放在赋值表达式左边的事物——在栈上或堆上分配的命名对象,或者其它有明确的内存地址的对象成员。右值这个概念也来自C语言,值的是可以出现在赋值表达式右侧的对象——例如,文字常量和临时变量。因此,左值引用只能被绑定在左值上,而不是右值。
例如下面这样写是错的:
// 编译错误 int& num = 1;
但是你可以使用下面的这种方式来对一个右值进行引用:
const int& i = 1;
i是一个const左值,之所以可以这样写,是因为发生了隐式转换。就像我们可以对左值的const引用创建临时性的对象,并将其作为参数传递给函数。比如:
void print(const string& s); print("hello"); //创建了string的对象
在C++11标准中介绍了右值引用(rvalue reference),这种方式只能绑定右值,不能绑定左值,它通过两个&&来进行声明:
int&& i = 1; int j = 42; int&& k = j; //编译错误
因此可以通过函数重载的方式来确定:函数有左值或右值为参数的时候,看是否能被同名且对应参数为左值或有值引用的函数所重载。
相关文章推荐
- c++11的使用心得(二)---右值引用
- c++11移动语义右值引用
- c++11 右值引用 &&
- C++11 标准新特性: 右值引用与转移语义
- C++11:右值引用和转移赋值
- C++11之右值引用(二):右值引用与移动语义
- C++11 理解 (三) 之 右值引用
- C++11中的右值引用和move函数
- C++11中的右值引用及move语义编程
- C++11 标准新特性: 右值引用与转移语义(点评)
- c++11 shared_ptr & unique_ptr & move semantics(右值引用) & lock_guard & final 和 override 关键字
- C++11 左值、右值、右值引用
- C++11之右值引用(一):从左值右值到右值引用
- C++11中的右值引用
- 如何评价 C++11 的右值引用(Rvalue reference)特性
- C++11 标准新特性: 右值引用与转移语义
- C++11中的右值引用及move语义编程
- C++11之右值引用(一):从左值右值到右值引用
- c++11 右值引用
- C++11右值引用自写测试例子