翻译「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 ...
随机推荐
- 激活Maven profile的几种方式
首先简单介绍下 Maven 的 profile 是什么.对于人来说,profile 是指人的肖像,轮廓,比如论坛里每个人注册了帐号后,可以设置自己的 profile,放上照片,介绍等等.对于 Mave ...
- IntelliJ IDEA优化总结
1.修改JVM参数 (IntelliJ IDEA 10.0.1包含以上版本不需要设置)修改idea.exe.vmoptions配置文件调整以下内容:-Xms256m-Xmx384m-XX:MaxPer ...
- 【Android学习日记】
(一) Android 开发基础 1 Android平台的特性 1) 应用程序框架支持组建的重用和替换,包括打电话应用程序.文件管理器等. 2) Dalvik虚拟机专门为移动设备做了优化,Dalv ...
- difference between instance variable and property
@interface MyClass : NSObject { NSString *name; NSArray *items; Something *something; IBOutlet NSTex ...
- svn 批量更新 bat脚本
由于有多个程序放在svn上管理,每天都要进入相应的目录进行svn 更新操作,现在写了一个简单的脚本进行批量自动更新. Code@echo off @echo ********************* ...
- BEvent_客制化BusinessEvent通过Workflow Event接受消息传递(案例)
2014-08-03 Created By BaoXinjian
- Codeforces Round #373 (Div. 2)A B
Codeforces Round #373 (Div. 2) A. Vitya in the Countryside 这回做的好差啊,a想不到被hack的数据,b又没有想到正确的思维 = = [题目链 ...
- BestCoder Round #84 Aaronson
Aaronson 题意: 给个中文链接:戳戳戳 题解: 这题一看给的公式就是二进制,之后马上就能想到当m大于等于二进制的位数时,输出n的二进制的1的个数就好了.之后就是m小于二进制的位数时,只要加上2 ...
- NeHe OpenGL教程 第二十六课:反射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- python(5)字符串处理 (sub,replace,find,index,upper,strip,split,sub翻页
一,sub和replace的用法 re.sub 函数进行以正则表达式为基础的替换工作 re.sub替换到目标字符串中的a,b或者c,并全部替换 另加上sub翻页操作: re.sub('start=\d ...