在C++11中,auto关键字被作为类型自动类型推导关键字
(1)基本用法
C++98:类型 变量名 = 初值;   int i = 10;
C++11:auto 变量名 = 初值;  auto i = 3.14;
借助于auto关键字,可对变量进行隐式的类型定义,即由编译器在编译期间根据变量的初始化语句,自动推断出该变量的类型.
auto a = ;//a被推导为int
auto b = );//b推导为int*
auto const *c = &a;//
在旧语法中,auto型变量存储于栈区,static型变量存储于静态区,二者不能同时使用,但c++11的auto关键字已经不再作为存储类型指示符
;
auto int j; //error
auto并不能代表一个世纪的类型声明,只是一个类型声明的占位符,使用auto声明的变量必须马上初始化,以让编译器推断出它的实际类型并在编译剪短将auto替换为真的类型
auto k; //error
 
(2)auto同指针或引用结合使用
即使不把auto声明为指针,其亦可被推导为指针类型
;
auto *b = &a; //auto=int  b==>int*
auto c = &a   //auto=int* c==>int*
当表达式带有引用属性时,auto会抛弃其引用属性
auto &d = a;  //auto=int  d==>int&
auto e = a;   //auto=int  e==>int
当表达式带有CV限定,auto会抛弃其CV限定
auto const f = a;  //auto=int  f==>int const
auto g = f;        //auto=int  g==>int
但是如果auto和引用或指针结合使用,表达式的CV限定会被保留下来
auto const &h = a; //auto=int  h==>int const&
auto &i = h;       //auto=int const  i==>cosnt &
auto *j = &h;      //auto=int const  j==>int const*
 
(3)auto使用的限制
auto不能用于函数的参数
void foo(auto i){...}//error 无法推导为int
foo();
auto不能用于类的非静态成员变量
auto不能用于模板的类型实参(模板的类型实参都是)
Dummy<int> d1;
Dummy<auto> d2 = d1; //error
auto不能用于数组元素
];
auto b[10] = a;//error
auto c = a; //ok,但是c推断为int*
auto &d = a; //ok,但是此时a代表的是数组整体不是首地址
 
(4)何时使用auto
通过auto减少模板的类型参数
通过auto可以简化某些复杂类型的书写
#include <iostream>
#include <typeinfo>
#include <map>
#include <string>
using namespace std;
class A{ public: A():m_var(arg){} int get(void)const{return m_var;} void set(int arg){m_var = arg;} private: int m_var; };
class B{ public: B(char const *arg = ""):m_var(arg){} char const *get(void)const{return m_var;} void set(char const *arg){m_var = arg;} private: char const *m_var; };
//C++98版本 template<typename V,typename X> void foo(X const &x){ V var = x.get(); cout << var << endl; }
//C++11版本 template<typename X> void bar(X const &x){ auto var = x.get(); cout << var << endl; } int main(void) { A a(); B b("abcd"); foo<int>(a); //X会隐式推断 foo<char const*>(b); multimap<string,int> mm; mm.insert(make_pair()); mm.insert(make_pair()); mm.insert(make_pair()); mm.insert(make_pair()); mm.insert(make_pair()); mm.insert(make_pair()); //C++98版本 pair<multimap<string,int>::iterator,multimap<string,int>::iterator> its1 = mm.equal_range("zhangfei"); ; for (multimap<string,int>::iterator it=its1.first; it != its1.second; it++) sum1 += it->second; cout << sum1 << endl; //c++11 auto版本 auto its2 = mm.equal_range("zhangfei"); ; for(auto it = its2.first; it != its2.second; it++) sum2 += it->second; cout << sum2 << endl; ; }
 
 
 
 
 

C++11 - 类型推导auto关键字的更多相关文章

  1. C++11 类型推导auto

    在C++11之前,auto关键字用来指定存储期.在新标准中,它的功能变为类型推断.auto现在成了一个类型的占位符,通知编译器去根据初始化代码推断所声明变量的真实类型.使用auto会拖慢c++效率吗? ...

  2. C++11特性:auto关键字

    前言 本文的内容已经不新鲜了.关于auto,翻来覆去被人知道的都是这些东西,本文并没有提出新颖的auto用法. 本人原是痛恨博客一篇篇都是copy而来缺乏新意的探索,当然,本文不是copy而来,但发布 ...

  3. C++11类型推导

    [C++11类型推导] auto 关键字.这会依据该初始化子(initializer)的具体类型产生参数: 除此之外,decltype 能够被用来在编译期决定一个表示式的类型. 参考:http://z ...

  4. C++11 自动推导auto

    C++11 自动推导auto C++11中引入的auto主要有两种用途:自动类型推导和返回值占位. auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准 ...

  5. C++11 类型推导decltype

    我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通 ...

  6. 【C++11新特性】 auto关键字

    原文链接: http://blog.csdn.net/xiejingfa/article/details/50469045 熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如pyt ...

  7. C++ 11 auto关键字

    熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如Python,可以直接声明变量,在运行时进行类型检查.随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今 ...

  8. C++ auto 关键字的使用

    C++98 auto 早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期: ...

  9. auto关键字使用

    auto类型变量--根据初始值推断真实的数据类型. 有些时候并不能很确定一个变量应该具备的数据类型,例如:将一个复杂表达式的值赋给某个变量,此时并不能很明显的确定这个值所具备的数据类型.此时auto关 ...

随机推荐

  1. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...

  2. Xamarin.Android和UWP之MVVM的简单使用(一)

    0x01 前言 就目前而言,MVVM可以说是挺流行的,无论是web端还是移动端,web端的主要代表angularjs,avalonjs等, 移动端(xamarin,uwp)的代表应该是mvvmligh ...

  3. Spring 3.0 AOP (一)AOP 术语

    关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方 ...

  4. sessionPageState与视图状态存储

    这个配置节甚是简单,在MSDN中的介绍也甚是简单:为 ASP.NET 应用程序配置页的视图状态设置. historySize的作用是设置要存储在页历史记录中的项数. 但是这根本是看不明白他是干嘛的,百 ...

  5. ASP.NET MVC4实现TinyMCE 4.0.20自定义上传功能

    tinymce 插件不提供免费的本地图片上传功能,所以自己将uploadify这个上传插件整合到tinymce,实现本地上传,还用到了jquery.ui插件,先展示全部的代码 @model TinyM ...

  6. 创建javaScript对象的方法

    一.工厂模式 function person (name,age) { var p=new Object(); p.name=name; p.age=age; p.showMessage=functi ...

  7. 背水一战 Windows 10 (12) - 绘图: Shape, Path

    [源码下载] 背水一战 Windows 10 (12) - 绘图: Shape, Path 作者:webabcd 介绍背水一战 Windows 10 之 绘图 Shape - 图形 Path - 路径 ...

  8. MessageBox的常用方法

    一 函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口句柄, ...

  9. luogg_java学习_05_面向对象(方法和类)

    这篇总结断断续续写了2天,内容来自Oracle java8编程入门官方教程和课外搜索总结,希望自己以后返回来看的时候都懂,也希望可以起到帮助初学者的作用. 转载请注明 出自 luogg的博客园 , 因 ...

  10. 2>&1 linux

    2>&1使用 2>&1使用 一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |).2)默认地,标准的输出为终端(terminal),但是也可 ...