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) 我们得到一个右值引用。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zx232311/article/details/52349376

vSphere 虚拟化环境中存储与网路的概念

这个系列课程重点介绍vSphere的网路构成与存储相关技术特色,通过本系列课程的学习来实现对于vSphere里IP Storage概念、vSwitch概念等的掌握。同时,进一步帮助了解NIC Teaming、Failover之类的技术细节
  • 2017年09月22日 11:47

C++11 左值、右值、右值引用详解

左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。...
  • u010599509
  • u010599509
  • 2016-07-27 13:27:58
  • 7584

C++11右值 &&引用

via:http://www.cnblogs.com/TianFang/archive/2013/01/26/2878356.html C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍...
  • Ink_cherry
  • Ink_cherry
  • 2017-06-06 11:56:25
  • 656

C++11之左值、纯右值和将亡值

在C++11中所有的值一定属于左值、纯右值和将亡值三种值之一,分别介绍一下这三种类型。左值与右值在C++中定义左值与右值的比较标准的方法是根据其可以取地址来判断。左值就是可以对变量进行取地址或者有名字...
  • StephenZou14
  • StephenZou14
  • 2017-09-03 12:33:10
  • 409

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

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

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

解决移动语义及完美转发问题
  • zwvista
  • zwvista
  • 2013-10-05 19:52:37
  • 10391

C++11 新特性之右值引用和转移构造函数

问题背景 [cpp] view plaincopy #include        using namespace std;       v...
  • Kaitiren
  • Kaitiren
  • 2014-03-27 17:03:48
  • 4771

C++11移动语义探讨——从临时对象到右值引用

一.前言这篇文章主要谈谈c++11中引入的右值引用概念和移动语义概念。以及这些东西可能在我们编程中带来哪些体验、便捷或者是代码效率的提高。 文章主要分为以下三点: 临时对象的产生 何谓右值引用 何谓...
  • y1196645376
  • y1196645376
  • 2017-02-07 16:16:41
  • 778

C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

C++11, 右值引用,move, forward
  • xiaolewennofollow
  • xiaolewennofollow
  • 2016-09-16 23:59:40
  • 1738

C++11新特性应用--让你的程序更高效(右值引用避免深拷贝)

这里的内容注意参考书籍《深入应用C++11代码优化与工程级应用》今天,重温一下右值。使用右值,使得我们的C++程序更加高效。我们可以简单把右值理解为一个临时变量。之前,我们谁也不会在意这个临时变量,但...
  • wangshubo1989
  • wangshubo1989
  • 2016-01-07 21:38:51
  • 2525
收藏助手
不良信息举报
您举报文章:C++11中有关右值的一些概念
举报原因:
原因补充:

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