您的位置:首页 > 编程语言 > C语言/C++

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

2010-12-26 21:41 369 查看
一、右值引用

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[/code] 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: