在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. jQuery-1.9.1源码分析系列(十) 事件系统——事件包装

    首先需要明白,浏览器的原生事件是只读的,限制了jQuery对他的操作.举个简单的例子就能明白为什么jQuery非要构造一个新的事件对象. 在委托处理中,a节点委托b节点在a被click的时候执行fn函 ...

  2. 数据库设计(1/9):数据元(Data Elements)

    对于设计和创建数据库完全是个新手?没关系,Joe Celko,世界上读者数量最多的SQL作者之一,会告诉你这些基础.和往常一样,即使是最专业的数据库老手,也会给他们带来惊喜.Joe是DMBS杂志是多年 ...

  3. OracleSugar ORM框架的诞生,代码开源

    经过四天的努力终于将SqlSugar ORM 成功支持ORACLE数据库 优点: 1.高性能,达到原生最高水准,比SqlHelper性能要高,比Dapper快30% 比EF快50% 2.支持多种数据库 ...

  4. 学习C#线程

    2016-12-17 无意间看到了关于C#线程的讲解.经过一下午的学习后,慢慢的对线程也有了一定的理解.这里讲解的是最基础的内容,包括线程的创建.睡眠.等待.终止. 实验环境:Visual studi ...

  5. 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解

    原文地址:http://docode.top/Article/Detail/10003 目录: 1..Net(C#)平台下Des加密解密源代码 2..Net(C#)平台下Aes加密解密源代码 3..N ...

  6. 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间

    [源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...

  7. 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait

    [源码下载] 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait 作者:webabcd 介绍速战速决 之 PHP 类基础 抽象类 接口 trait 示例1.类的相关知识点 1(基础 ...

  8. csharp:ASP.NET SignalR

    http://signalr.net/ https://github.com/SignalR/SignalR http://www.asp.net/signalr http://www.cnblogs ...

  9. springmvc的类型转换

     一.springmvc的类型转换 (一)默认情况下,springmvc内置的类型转换器只能 将"yyyy/MM/dd"类型的字符串转换为Date类型的日期 情境一: 而现在我们无 ...

  10. java多线程-线程池

    线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等. 我们可以把并发执行的任务传递给一个线程池, ...