C++11新引入的特性比较多,这里简单记录下每个特性的大致情况,无法将细节一一描述清楚——那样每个特性几乎都要花费一篇博客的篇幅来记录。本文从新增的关键字 、 新增的语义 、新增的标准库三个方面来记录这些新特性。原本打算将这三部分放到一篇博客中,后来发现太长了,还是分开吧。
0,重点特性概览
个人觉得,auto、统一的初始化(使用“{}”)、右值引用、lambda是C++11里面重量级的四个特性了,auto简化了各种标识符的声明,大括号统一了初始化代码的形式,右值引用作用下的移动语义大大改善了代码性能,lambda表达式则令代码更加简洁,lambda定义在函数体内可以使代码可读性提高很多、封装也更符合日常思维。当然其他特性诸如可变参数模板多线程库等也值得大书特书,但由于个人水平有限,只能将诸多特性做一些浅显的记录,谓之“集锦”。
1,新增的关键字
1.1 auto、decltype
事实上,在C++98里已经使用过auto关键字,用来表示一个变量拥有自动的生命周期,但是平时基本用不到,C++11标准就把旧版的这个作用废除了,将auto用作自动类型推断。
auto的引入大大减少了代码的长度——让编译器自己推断标识符的类型而不是人工指定,大多数情况下,编译器是清楚地知道标识符的具体类型的。
vector<int> arr;
......
vector<int>::iterator it = arr.begin();
auto it2 = arr.begin();//比上面的代码简直爽太多了。
不过,auto的引入也有小小的不利——牺牲了代码的一部分可读性,例如:
auto value = myFunction();
编译器会清楚地知道value的类型,但程序员不一定——除非看一下myFunction的函数声明。但总的来说,利是远远大于弊的。
当我们用一个值或者表达式来初始化一个变量时,可以用auto声明该变量,编译器会自动推断出它的类型,但有些时候,我们不想用一个值或者表达式初始化变量——只想用值的类型来声明一个变量,此时就可以用decltype关键字了,它能够提取变量或者表达式的类型:
//value的类型是myFunction的返回值的类型,此处并不会真正执行myFunction
decltype(myFunction()) value;
值得注意的是,decltype推断的结果与表达式的形式密切相关:假如表达式外层有一层或多层小括号,得到的将是引用类型:
int a = 10;
decltype(a) b; //正确,b的类型是int,b未被初始化。
decltype((a)