在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. 【Android】[转] Android Codec默认profile使用的是Baseline

    关于Android默认Codec使用的Profile找了半天没发现,还是Google的时候发现了开源中国有网友写的这边博客,相关的内容很少,便贴了过来做个笔记. 以下内容转自Android Media ...

  2. PHP之验证码的实现

    简单的用PHP实现验证码: ?php /** *制作验证码 *1.启动session *2.设定标头 *3.创建画布 *4.创建颜色 *5.创建随机数并放到画布上 *6.将得到的若干随机数放入sess ...

  3. 多个 App 间启动

    http://developer.nokia.com/: URI associations for Windows Phone http://msdn.microsoft.com/: Auto-lau ...

  4. Moon.Orm 5.0 (MQL版) 欣赏另一种Orm的设计风格----大道至简

    Moon.Orm 5.0(MQL版)使用指南(二) 一.使用sql及存储过程 1)使用List<Dictionary<))) 2)MQL 全面接触

  5. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  6. 无聊的人用JS实现了一个简单的打地鼠游戏

    直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...

  7. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  8. Ubuntu实现树莓派交叉编译

    一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时 ...

  9. Nancy之基于Self Hosting的补充小Demo

    前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...

  10. MS SQL Server 数据库分离-SQL语句

    前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...