C++0x的三个特性:右值引用,static_assert,auto

一、右值引用

C++0x 中引入了右值引用(rvalue reference)这个设施,形如T&&,用来实现移动语义(move semantics)和完美转发(perfect forwarding)。此前C++中有一个著名的性能问题——复制临时对象,由于右值引用的引入,该问题将得到极大的改善。

虽然右值引用的引入是一个很了不起的进步,也是一个明智的决定,但它并不那么讨人喜欢,至少我觉得如此。原因有二:首先是其概念本身就不容易理解,增加了一些智力负担;另外如果想享受它带来的性能好处,还必须增加一些编码工作量。

什么是左值和右值

我们首先需要熟悉一下现行C++98/03标准中,左值和右值的概念。网上现在充斥着很多对它们的解释,长篇大论的有,只言片语的也有,而且不一定清晰正确,可谓良莠不齐,这里我希望能够尽量简单准确地进行说明。

这里有两个问题经常令人混淆,必须首先澄清一下:

1. lvalue(left value)和rvalue(right value)的概念经过了长时间的演化,早已名不副实,千万不要把L和R当做真正的左右来理解。最早或许left value意味着在等号左边,right value意味着在等号右边,但对于现代C++这么复杂的语法来说,早就不适用了。
2. 左值还是右值,是针对某个表达式而言的,而不是针对某个具体值或者对象本身而言。C++ 03 标准 3.10/1 节:“每一个表达式要么是一个lvalue,要么就是一个rvalue。”因此不要单纯的考虑数字1是左值还是右值,或者存在地址0x100000上的那 个string对象到底是左值还是右值,重要的是看表达式。

 

二、静态断言

C++0x中引入了static_assert 这个关键字,用来做编译期间的断言,因此叫做静态断言。

其语法很简单:static_assert (常量表达式,提示字符串)。

如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert 不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert 语句所在行,错误提示就是第二个参数提示字符串。

 

三、auto

 

最典型的用法如下:
auto x = expression ;

x的类型将由等号后面表达式的类型来确定,最明显的好处是,对于某些复杂类型,我们不用再明确写出其类型,例如我们经常遇到的对STL容器遍历时,写的那个迭代器类型。

除了直接声明auto 类型的变量外,还可以组合成较复杂的形式,例如:

auto

& x = expression
;

auto
const
& x = expression
;

auto
* x = expression
;

auto
const
* x= expression
;

auto
x[100] = expression
;

  

说明

auto 关键字是一个占位符(placeholder),表示待推断的类型,主要用于变量的初始化表达式,它可以其它的类型修饰符联合使用,包括const, volatile等,例如:

auto

score = 100; // score的类型是int


auto
volatile
pi = 3.14; // pi的类型是double volatile


auto
const
* msg = "hello, world"
; // msg的类型是char const
*





auto 关键字在用于创建对象有点特别,它可以和new 一起调用拷贝构造函数来创建一个对象,例如:

1: auto x1 = new auto (1); // 正确,x1为int* 2: int * x2 = new auto (2); // 正确,x2为int* 3: auto y1 = auto (1); // 错误 4: int y2 = auto (1); // 错误




http://blog.csdn.net/thesys/category/690070.aspx
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值