C++11中有关右值的一些概念

原创 2016年08月29日 02:26:34

1 右值/左值

先简单说说在c++11中几个有关右值的规定:
1. 左值无法绑定一个右值引用.
2. 变量表达式具有左值属性。

我们可以将一个变量视为一个变量表达式,一个没有操作符的的单个表达式。那么右值引用作为一个变量,它本身具有左值属性。

int &&rvalue = 1;
int &&rr = rvalue; //error  rvalue是一个变量,具有左值属性,左值无法绑定右值引用。

2 模板参数的右值

接下来讲讲有关右值的模板形参推导。
当模板形成为右值引用时,我们有一些特殊的规则:
1. 实参的类型为左值时推导为左值引用。
2. 实参的类型为右值时推导为不带引用类型。
3. 引用折叠,可以记为左值有感染性,T& &&T& & 都折叠为 T&, 只有 T&& && 折叠为 T&&

template <typename T> func(T && var);

当我们给 func 传递一个 左值或者左值引用时, T 被推导为 T& ;当时传递一个右值引用或者右值时,推导为 T

int i = 0;
func(i); // 推导为 int&
func(12); // 推导为int1

3 有关与转发

上面讲过,变量具有左值属性,函数形参也是如此:

func(int&& i){
    //i具有左值属性。
}

对此,有人称为 右值的具名引用为左值,或者像我讲的 变量具有左值属性 ,让我们看看委员会怎么讲:

Things that are declared as rvalue reference can be lvalues or rvalues. The distinguishing criterion is: if it has a name, then it is an lvalue. Otherwise, it is an rvalue.

那么问题就来了:

void g(int &&i);
void f(int &&c){
    g(c);
}

虽然 c 是一个右值引用,但是作为变量它具有左值属性,那么左值是不能绑定右值引用的,于是代码error了。
我们可以通过 std::forward 来解决这个问题,还原变量原本的左右值属性。它的实现会利用到 右值引用的模板形参类型推导

template <typename T>
std::remove_reference<T>::type&& forward(std::remove_reference<T>::type& arg) {
    return static_cast<T&&>(arg);
 }

template <typename T>
std::remove_reference<T>::type&& forward(std::remove_reference<T>::type&& arg) {
    return static_cast<T&&>(arg);
}

显然,根据实参类型进行重载解析,当实参为左值引用的时候, T 被推导为 T& 。那么 static_cast < T& &&>(arg) ,根据引用折叠规则我们得到一个左值类型; 当实参为右值引用的时候T 被推导为 T&&static_cast< T&& && >(arg) 我们得到一个右值引用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

std::move C++11 标准新特性: 右值引用与转移语义

新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics...

C++11右值引用和move语义

最近面试被问到这个没答上来,在此整理一下右值引用在C++11当中又一个概念叫做右值引用,这个概念我们首先要能够进行区分左值和右值的概念,左值就是一个具体的内存对象,可以修改的,右值就是一个值,这个值可...

C++11新特性(1) 右值引用

在C++中,左值(lvalue)是可以获取其地址的一个量。由于经常出现在赋值语句的左边,因此称之为左值。例如一个有名称的变量。 例如: int a=10; //a就是一个左值。      传统的...

C++11 标准新特性: 右值引用与转移语义

文章出处:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rva...
  • hanmx_x
  • hanmx_x
  • 2017年05月09日 16:55
  • 216

C++11尝鲜:右值引用和转发型引用

解决移动语义及完美转发问题
  • zwvista
  • zwvista
  • 2013年10月05日 19:52
  • 10069

C++11新特性:移动语义和右值引用

右值引用传统的C++引用(左值引用)使得标识符关联到左值。左值是一个表示数据的表达式(如变量名或解除引用的指针),程序可以获得其地址。 C++11新增了右值引用。右值引用,顾名思义,可以关联到右值,...

图说函数模板右值引用参数(T&&)类型推导规则(C++11)

图说函数模板右值引用参数(T&&)类型推导规则(C++11) 见下图: 规律总结: 只要我们传递一个基本类型是A④的左值,那么,传递后,T的类型就是A&,形参在函数体中的类型就是...

右值引用C++11

C++ 11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”(move semantics)的基础。而要理解右值引用,就必须先区分左值与右值。        对左值和右值的一个...
  • SAYA_
  • SAYA_
  • 2015年10月22日 11:42
  • 397

C++11 右值引用

右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 ...
  • oqqNAME
  • oqqNAME
  • 2014年04月07日 21:27
  • 463

C++11右值引用自写测试例子

#include #include #include /* *C++ 11增加一个新的引用(reference)类型称作右值引用(R-value reference), *标记为typename &&...
  • zhl11a
  • zhl11a
  • 2015年04月16日 13:36
  • 342
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++11中有关右值的一些概念
举报原因:
原因补充:

(最多只允许输入30个字)