C++11中引入auto第一种作用是为了自动类型推导auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以大大简化我们的编程工作auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。auto a; // 错误,auto是通过初始化表达式进行类型推导,如果没有初始化表达式,就无法确定a的类型 auto i = 1; auto d = 1.0; auto str = "Hello World"; auto ch = "A"; auto func = less<int>(); vector<int> iv; auto ite = iv.begin(); auto p = new foo() // 对自定义类型进行类型推导auto不光有以上的应用,它在模板中也是大显身手,比如下例这个加工产品的例子中,如果不使用auto就必须声明Product这一模板参数:template <typename Product, typename Creator> void processProduct(const Creator& creator) { Product* val = creator.makeObject(); // do somthing with val } .如果使用auto,则可以这样写:template <typename Creator> void processProduct(const Creator& creator) { auto val = creator.makeObject(); // do somthing with val }抛弃了麻烦的模板参数,整个代码变得更加正解了。
decltype
decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,有实例如下:int x = 3; decltype(x) y = x;有人会问,decltype的实用之处在哪里呢,我们接着上边的例子继续说下去,如果上文中的加工产品的例子中我们想把产品作为返回值该怎么办呢?我们可以这样写:template <typename Creator> auto processProduct(const Creator& creator) -> decltype(creator.makeObject()) { auto val = creator.makeObject(); // do somthing with val }
nullptr
nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代表的是0,void F(int a){ cout<<a<<endl; }void F(int *p){ assert(p != NULL); cout<< p <<endl; }int main(){ int *p = nullptr; int *q = NULL; bool equal = ( p == q ); // equal的值为true,说明p和q都是空指针 int a = nullptr; // 编译失败,nullptr不能转型为int F(0); // 在C++98中编译失败,有二义性;在C++11中调用F(int) F(nullptr); return 0; }更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2013-12/93835p2.htm相关阅读:C++11新特性:自动类型推断和类型获取 http://www.linuxidc.com/Linux/2013-12/93369.htmQt5 中对 C++11 一些新特性的封装 http://www.linuxidc.com/Linux/2013-12/93368.htmC++11新特性:Lambda函数(匿名函数) http://www.linuxidc.com/Linux/2013-12/93367.htmC++11 日志框架 Chucho http://www.linuxidc.com/Linux/2013-12/93836.htm