1. auto类型推导

下面是auto的使用举例:

auto x =5; //正确,x是int类型
auto pi = new auto(1); //正确,批是int*
const auto* v = &x, u = 6; //正确,v是const int类型,u是const int
static auto y = 0.0; //正确,y是double类型
auto int r; //错误,auto不再表示存储类型的指示符
auto s; //错误,auto无法推导出s的类型(必须马上初始化)

auto并不能代表一个实际的类型声明(上面s编译错误),只是一个类型声明的“占位符”。使用auto声明的变量必须马上初始化,以让编译器推断出它的类型,并且在编译时将auto占位符替换为真正的类型。

2. auto类型推导规则

int x = 0;
auto *a = &x;      //a->int*,auto被推导为int
auto b = &x;       //b->int*,auto被推导为int*
auto &c = x;       //c->int&,auto被推导为int
auto d = c;        //d->int, auto被推导为intconst auto e = x;       //e->const int
auto f = e;            //f->intconst auto& g = x;      //e->const int&
auto& h = g;           //g->const int&

auto的推导规则:
(1)当声明为指针或是引用时,auto的推导结果将保持初始化表达式的const属性。(保留const)
(2)当不声明为指针或是引用时,auto的推导结果和初始化表达式抛弃引用和const属性限定符后的类型一致,图上面的d和f。(不保留const)

3. auto类型推导的限制

(1)auto不可以用于函数参数

void func(auto a=1){}   //错误,不可以用作函数参数

(2)auto不可以用于非静态成员变量

struct Foo
{auto var1 = 0;                //错误,不能用于非静态成员变量static const auto var2 = 0; //正确,var2->static const int
};

注:auto仅能够用于推导static const的整型或者美剧成员(因为其他静态成员无法在类或是结构体中就地完成初始化,都需要在类的外部进行初始化)。C++11中支持非静态成员变量的就地初始化,但却不支持auto类型的非静态成员变量初始化。
(3)auto类型不能用于定义数组

int a[10] = {...};
auto b[10] = a;                    //错误,auto类型无法定义数组

(4)auto类型无法导出模板参数

template<typename type> struct Bar
{...
};
Bar<int> a;
Bar<auto> b = a;             //错误,auto无法推导出模板参数

4. auto类型推导的使用场景

(1)需要极大简化书写的时候,例如在定义STL迭代指针的时候

int a[] = {1, 2, 3, 4};
std::vector<int> vec(a, a+4);
std::vector<int>::iterator it = vec.begin();
for(; it != vec.end(); ++it)
{...
}

在使用auto类型推导之后

int a[] = {1, 2, 3, 4};
std::vector<int> vec(a, a+4);
for(auto it = vec.begin(); it != vec.end(); ++it)
{...
}

(2)在无法知道变量该定义成何种类型的时候

class A
{static int func1(void){return 1;}
};class Bar
{double func1(void){return 0.0;}
};template<typename type> func3()
{auto a = type::func1();...
}

C++11 auto类型推导相关推荐

  1. Effective Modern C++翻译(3)-条款2:明白auto类型推导

    条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一 ...

  2. C++11 decltype类型推导详解

    decltype decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"declare type" ...

  3. C++11 auto类型说明符

    编程时常常需要将表达式的值赋值给变量,这就要求在声明变量前知道表达式的类型,有时候很难预先知道,所以C++11新标准引入了auto类型说明符,其作用就是让编译器替我们去分析表达式的值类型,,auto让 ...

  4. [C++11]自动类型推导auto

    1.auto C++11中,auto并不代表一种实际的数据类型,只是一个类型声明的"占位符",auto并不是万能的在任意场景下都能够推导出变量的实际类型,使用auto声明的变量必须 ...

  5. C++11 auto自动推导

    文章目录 C++98 auto C++11赋予auto更强大的功能 规则 auto的常见用法 用于代替冗长复杂.变量使用范围专一的变量声明. 在定义模板函数时,用于声明依赖模板参数的变量类型. 模板函 ...

  6. c++11 auto 类型说明符详解

    当使用 auto 自动推断类型时,需要注意以下几点: 一.必须要有初始值 一个显而易见的道理,auto 表示编译器根据初始值类型推断声明变量的类型,因此必须要有初始值. 二.一条声明语句只能有一种基本 ...

  7. C++11 auto自动类型推导

    1. auto类型推导 下面是auto的使用举例: auto x =5; //正确,x是int类型 auto pi = new auto(1); //正确,批是int* const auto* v = ...

  8. C++11 类型推导decltype

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

  9. 《Effective Modern C++》翻译--条款2: 理解auto自动类型推导

    条款2: 理解auto自动类型推导 如果你已经读过条款1关于模板类型推导的内容,那么你几乎已经知道了关于auto类型推导的全部.至于为什么auto类型推导就是模板类型推导只有一个地方感到好奇.那是什么 ...

  10. C++11新特性之decltype类型推导

    ​ 目录 一.decltype关键字 二.decltype的推导规则 1.表达式为单独变量 2.表达式为函数调用 3.表达式为左值,或者被()包围 三. decltype的应用 在前面一章,小编已经对 ...

最新文章

  1. iis8.5部署net项目
  2. datagrid单选多选
  3. Linux下的Nano命令
  4. Scala集合:List修改及删除数据
  5. “约见”面试官系列之常见面试题之第九十一篇之简述Vue的生命周期适用于哪些场景(建议收藏)
  6. 【BZOJ2565】最长双回文串(回文树)
  7. 本地网络适配器里找不到虚拟机VMnet8
  8. gtx1060+linux+双显卡,ubuntu14.04+GTX1060 重新安装显卡驱动
  9. java实现汉诺塔游戏(递归)(附超详细易懂注释)
  10. ISCSLP 2022 | AccentSpeech—从众包数据中学习口音来构建目标说话人的口音语音合成系统
  11. java tea bag_设计模式系列教程—Template Method Pattern(模板方法模式)
  12. Leetcode刷题-最长公共前缀
  13. 你是这样的 CSS,19个唯美的边框
  14. RISC-V为中国MCU企业打开一个新窗口!
  15. 【webpack系列】webpack小老弟打包大项目
  16. php获取QQ音乐直链,微信小程序-获取QQ音乐直链
  17. vue form表单数据提交与 router 按钮快速调用页面
  18. 区别:过去完成时、现在完成时、一般过去时
  19. 十一年架构师教你怎么打造PHP程序员简历
  20. php对电话号码生成图片,帝国CMS插件之手机号码生成图片格式插件

热门文章

  1. Go多线程并发避免堵塞
  2. “日薄西山”的摩托罗拉推出VR头显,这回靠谱吗?
  3. [译]如何成为一个优秀的前端工程师
  4. 4.docker 添加国内镜像
  5. 8.1 Zend_View
  6. 22.客户端识别与 cookie 机制
  7. 58. magento quote lifetime
  8. 3.2 Zend_Db_Select
  9. 83. 验证码(1)
  10. 14. Window clearInterval() 方法