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
关键字是一个占位符(placeholder),表示待推断的类型,主要用于变量的初始化表达式,它可以其它的类型修饰符联合使用,包括const, volatile等,例如:
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); // 错误
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]
相关文章推荐
- 【译】VC10中的C++0x特性 part 1:Lambdas,auto,以及 static_assert
- 【译】VC10中的C++0x特性 part 1:Lambdas,auto,以及 static_assert
- VC2010中的C++0x特性 Part 1:Lambdas,auto, static_assert
- VC10中的C++0x特性:Lambdas,auto,以及 static_assert
- 【译】VC10中的C++0x特性 Part 2 (1):右值引用
- VS2010 中的 C++ 0x 新特性:Lambdas、auto 和 static_assert
- 【译】VC10中的C++0x特性 Part 2 (1):右值引用
- VC10中的C++0x特性 Part 2 (3):右值引用
- VS2010 中的 C++ 0x 新特性:Lambdas、auto 和 static_assert
- 【译】VC10中的C++0x特性 Part 2 (2):右值引用
- VC10中的C++0x特性 Part 2 (1):右值引用
- 【译】VC10中的C++0x特性 Part 2 (2):右值引用
- [C++基础]020_C++0x新特性之右值引用(int&& value)
- 一篇好文:VC2010中的C++0x特性 Part 2:右值引用
- 【翻译】VC10中的C++0x新特性:右值引用(rvalue references) (2)
- 【翻译】VC10中的C++0x新特性:右值引用(rvalue references) (3)
- [C++基础]020_C++0x新特性之右值引用(int&& value)
- 【翻译】VC10中的C++0x新特性:右值引用(rvalue references) (1)
- VC2010中的C++0x特性 Part 2:右值引用
- VC10中的C++0x特性 Part 2 :右值引用