[C++11] 右值引用

1.右值跟左值由什么区别

左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不在存在的临时对象。

2.什么是右值?

在C++11中,右值由两个概念构成,一个是将亡值,另一个是纯右值。
纯右值:非引用返回的临时变量、运算表达式产生的临时变量、原始字面量、lambda表达式等。
将亡值:C++11新增的、与右值引用相关的表达式,比如,将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值。

3.如何区分右值?

所有具名变量或对象都是左值,而右值不具名。
便捷方法:能不能对表达式取地址,如果能,则为左值,否则为右值。

4.一些特性

  1. 无论声明左值引用还是右值引用,都需要立即初始化,因为引用类型本身不拥有绑定对象的内存,只是该对象的别名。

  2. 常量左值引用也可以用来做性能优化,因为常量左值引用是一个“万能”的引用类型,可以接收左值、右值、常量左值和常量右值。需要注意的是非常量左值引用只能接收左值。

  3. T&& 不一定就是表示右值,它绑定的类型是未定的,既可能是左值也有可能是右值。

template<typename T>
void f(T&& param);
 
f(10);      //10是右值
int x = 10;
f(x);      //x是左值

如上例,param有时是左值,有时是右值,这表示param实际上是一个未定的引用类型(universal reference)。它必须被初始化,
如果&&被一个左值初始化就是左值;如果&&被一个右值初始化就是右值。
需要注意的是,只有当发生自动类型推断时,比如函数模板的类型自动推导,或auto关键字,&&才是一个universal reference。

template<typename T>
void f(T&& param);         //universal reference,T的类型需要推导

class Test {
   ...
   Test(Test&& rhs);        //右值引用,已经定义了一个特定的类型,没有类型推断
   ...
}

void f(std::vector<T>&& param)       //右值引用,在调用 f 前,T的类型已经确定了

void f(const T&& param)            //右值引用,universal reference仅发生在T&&下,任何一点的附加条件都会使之失效

5.引用折叠

由于存在T&&这种未定的引用类型,当它作为参数时,有可能被一个左值引用或右值引用的参数初始化,这种 经过类型推导后的T&&类型,相比于右值引用(&&)会发生类型的变化,这种变化被称为引用折叠。
引用折叠规则:
(1)所有的右值引用叠加到右值引用上仍然还是一个右值引用。
(2)所有的其他引用类型之间的叠加都将变成左值引用。

左值和右值是独立于它的类型的,右值引用有可能是左值也可能是右值,编译器会将已命名的右值引用视为左值,而将未命名的右值引用视为右值。

int&& var1 = 0;               //var1的类型是int&&,但是本身是一个左值
auto&& var2 = var1;           //根据引用折叠规则(2),var2的类型是int&

下面在看一个例子:

int w1, w2;
auto&& v1 = w1;    //v1是universal reference, 被左值初始化,所以最终是一个左值
decltype(w1)&&  v2 = w2;   //报错!v2是一个右值引用类型,无法被左值初始化

如何将一个左值赋给一个右值引用类型呢?使用std::move, 可以将一个左值转换为右值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 本文根据众多互联网博客内容整理后形成,引用内容的版权归原始作者所有,仅限于学习研究使用,不得用于任何商业用途。 左...
    深红的眼眸阅读 11,276评论 1 12
  • C++11: rvalue 右值 rvalue & lvalue(右值与左值) 左值与右值的定义是比较复杂,下边仅...
    fck_13阅读 517评论 0 1
  • c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。 左...
    贰爷阅读 292评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,535评论 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未来发展的必然趋势吗?以后人工智能技术真的能达到电影里机器人的智能水平吗...
    ZLLZ阅读 3,776评论 0 5