[WIP] C++11: 右值引用与转移语义

之前在Paddle的blocking_queue里看到了std::move的用法,与之相关的是C++11(2011年)引入的新特性右值引用(Rvalve Reference),这里简单学习了一下。

右值引用主要目的有下面两个方面:

  1. 消除两个对象交互时不必要的对象拷贝
  2. 能够更简洁明确地定义泛型函数。

左值与右值的定义

C/C++中,所有的表达式和变量要么是左值,要么是右值。

通俗地理解,左值的定义是非临时对象,可以在多条语句中使用,所有的变量都是左值。而右值是指临时的对象,只在当前的语句中有效。例如下面这个简单的赋值语句:

1
int i = 0;

在这条语句中,i 是左值,0是右值(临时值)。i可以被引用,而0不可以。立即数都是右值。

右值也可以出现在赋值表达式的左边,但是不能作为赋值的对象,因为右值只在当前语句有效,赋值没有意义。例如下面这个例子:

1
((i > 0) ? i : j) = 1;

在这个例子中,0作为右值出现在了=的左边。但是赋值对象是ij,都是左值。

在 C++11 之前,右值是不能被引用的,最大限度就是用常量引用绑定一个右值,如 :

1
const int &a = 1;

在这种情况下,右值不能被修改的。但是实际上右值是可以被修改的,如 :

1
T().set().get();

既然右值可以被修改,那么就可以实现右值引用。

TODO

# C++

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×