翻译「C++ Rvalue References Explained」C++右值引用详解 Part1:概述
本文系对「C++ Rvalue References Explained」 该文的翻译,原文作者:Thomas Becker。
该文较详细的解释了C++11右值引用的作用和出现的意义,也同时被Scott Meyers推荐,全文共分11个部分,我将利用业余时间,分别翻译。
受笔者水平所限,可能叙述会出现些许问题,还望多多指正。
部分名词为了保持含义和方便理解,并未翻译成中文,有的在括号内给出了常见的中文翻译。
目录
- 概述
- Move语义
- 右值引用
- 强制Move语义
- 右值引用就是右值吗?
- Move语义和编译器优化
- Perfect Forwarding(完美转发):问题
- Perfect Forwarding(完美转发):解决方案
- 右值引用和异常
- Implicit Move情况
- 鸣谢和深入阅读
概述
右值引用是随着C++11标准被引入的一项C++特性。造成右值引用比较难于理解的地方在于:当你刚开始接触它的时候,比较难以搞清楚它存在的目的或者它将要解决什么样的问题。因此,我不会直接阐述什么是右值引用。相反,我会从将要被它解决的问题开始,然后给出是如何通过利用右值引用解决这些问题的。这样,右值引用的定义将会比较合理、自然的呈现给你。
右值引用至少将解决如下两个问题:
- 实现Move语义(aka. Move Semantics)
- Perfect forwarding(完美转发)
如果你对这些问题并不熟悉,不要担心。下面将会详细解释它们。我们先从Move语义开始。但在开始之前,我需要先提醒你C++中什么是左值(lvalues)和右值(rvalues)。想要给出一个严谨的定义是非常困难的,但是下面的解释对于目的来说已经足够了。
原始的关于左值和右值的定义在早期的C是这样的:一个左值是一个可能出现在一个赋值左手边或右手边的表达式e。右值则是只能出现在一个赋值右手边的表达式。举例:
int a = ;
int b = ; // a和b都是左值s:
a = b; // ok
b = a; // ok
a = a * b; // ok // a * b 是右值:
int c = a * b; // ok, 右值在赋值的右手边
a * b = ; // error, 右值在赋值的左手边
在C++中,最初这依然可用,也是对于左值和右值辨认的直觉方法。然而,随着C++和它的用户自定义类型引入了一些关于可变性(modifiability)和可转让性(assignability)的微妙变化,导致这个定义不再正确。我们不需要再深入探讨这个问题。接下来是另一份对此的定义,虽说它可能依然经不起推敲,但是可以让你用来处理右值引用:一个左值是一个能够指向内存地址的表达式,并允许我们通过&操作符来获取那块内存地址。一个右值是一个非左值的表达式。举例如下:
// 左值:
//
int i = ;
i = ; // ok, i是左值
int* p = &i; // ok, i是左值
int& foo();
foo() = ; // ok, foo()是左值
int* p1 = &foo(); // ok, foo()是左值 // 右值:
//
int foobar();
int j = ;
j = foobar(); // ok, foobar()是右值
int* p2 = &foobar(); // error,不能从右值取址
j = ; // ok, 42是右值
如果你对严谨的右值和左值定义感兴趣,Mikael Kilpeläinen的这份ACCU文章是就这个课题一份比较好的开始。
翻译「C++ Rvalue References Explained」C++右值引用详解 Part1:概述的更多相关文章
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part3:右值引用
本文为第三部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 右值引用 如果x是任意类型,那么x&&则被称作一个 ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part8:Perfect Forwarding(完美转发):解决方案
本文为第八部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part6:Move语义和编译器优化
本文为第六部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part5:右值引用就是右值吗?
本文为第五部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part4:强制Move语义
本文为第四部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 强制Move语义 众所周知,正如C++标准的第一修正案所陈述:“委 ...
- 「翻译」Unity中的AssetBundle详解(二)
为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...
- 「翻译」Unity中的AssetBundle详解(一)
AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...
- C++11标准之右值引用(rvalue reference)
1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision.RVO(包 ...
- c++11-17 模板核心知识(十)—— 区分万能引用(universal references)和右值引用
引子 如何区分 模板参数 const disqualify universal reference auto声明 引子 T&&在代码里并不总是右值引用: void f(Widget&a ...
随机推荐
- 关于css中列表(ul ol)存在默认间距的问题
一.总结: 有时候我们要给列表(ul ol 本身就是属于块级元素)的上表框或下边框设置颜色,如下: 但是在给内联块级元素(inline-block)的上表框或下边框设置颜色的时候,就没有这么简单: 在 ...
- bzoj2618: [Cqoi2006]凸多边形
Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一行有一个整数n,表示凸多边形的个数,以下依 ...
- golang的连接池例子
github.com/jolestar/go-commons-pool 测试代码 package main import ( "github.com/jolestar/go-commons- ...
- VB TreeView控件使用详解
来源:http://www.newxing.com/Tech/Program/VisualBasic/TreeView_587.html 三小时快速掌握TreeView树状控件的使用.能不能掌握控件的 ...
- flash builder 启动ios模拟器失败是什么原因?
参考知乎:http://www.zhihu.com/question/22537362 在mac os设置-安全性与隐私-隐私-辅助功能 找到flash bulder 打上前面的勾,如下图:
- (WPF, MVVM) Textbox Binding
参考:http://msdn.microsoft.com/en-us/library/system.windows.data.updatesourcetrigger(v=vs.110).aspx Te ...
- eclipse eayExplorer 查看代码的资源管理器打开方式
http://blog.csdn.net/w709854369/article/details/6599167 http://blog.samsonis.me/wp-content/uploads/2 ...
- Spark作业调度
Spark在任务提交时,主要存在于Driver和Executor的两个节点. (1)Driver的作用: 用于将所有要处理的RDD的操作转化为DAG,并且根据RDD DAG将JBO分割为多个Stage ...
- POJ 2411 Mondriaan'sDream(状压DP)
题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...
- cf 547B. Mike and Feet dp
题意: n个矩阵排成一排,n<=2e5,高度分别为hei[i],宽度为1 对于一些连续的矩阵,矩阵的size为矩阵的个数,矩阵的strength为这些矩阵中高度最低的那一个高度 求:for ea ...