ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

1_auto类型推导(深入应用C++11:代码优化与工程级应用)

2022-07-26 09:07:22  阅读:240  来源: 互联网

标签:11 const 推导 int auto 代码优化 declaration 类型


1. auto回顾

  在深入学习auto前,本人已经了解了auto的基本用法,对于简单类型推导能够清晰理解.如:

int i = 0;
auto ii = 1;    // auto被推导为int
auto iii = i;   // auto被推导为int

  本次学习是为了加深细节理解,如:auto 与指针\引用\cv限定符一起使用时的推导结果.

  回顾下简单类型的推导及使用auto时需要注意哪些.

int int_type = 1;               //int       auto被推导为int
float float_type = 1.0;         //float     auto被推导为float
const int const_int_type = 1;   //int const auto被推导为int
auto auto_int = 1;              //int       auto被推导为int
auto auto_double = 1.0;         //double    auto被推导为double

auto x= 5;                      //int       auto被推导为int
auto pi = new auto(1);          //int*      auto被推导为int*
const auto *v = &x, u=6;        //v:int const *    auto 被推导为 int
                                //u:int const      auto 被推导为 int
static auto y = 0.0;            //double           auto被推导为double
auto int r;         // error:two or more data types in declaration of 'r' 
int int r;          // error:two or more data types in declaration of 'r'
auto s;             // error:declaration of 'auto s' has no initializer

需要注意的是:

const auto *v = &x, u=6;
//在推导的时候u必须赋值,且所赋的值不能让auto推导产生二义性,否则无法通过编译
/**u 必须要赋值,否则就等价 const auto u;// error
    * 如:const auto *v = &x, u;
    * error: declaration of variable 'u' with deduced type 'const auto' requires an initializer
    */
/**并且u的初始化不能是编译器推导产生二义性,否则编译失败.
    * 如:const auto *v = &x, u =6.0;
    * error: 'auto' deduced as 'int' in declaration of 'v' and deduced as 'double' in declaration of 'u'
    */

  由上面的例子可以看出来,auto并不能代表一个实际的类型声明(如s的编译错误),只是一个类型声明的"占位符".

  使用auto声明的变量必须马上初始化,以上编译器推断出它的实际类型,并在编译时将auto占位符替换为真正的类型.

2. auto推导规则

int x = 0;
auto * a = &x;          // int* auto被推导为int
auto   b = &x;          // int* auto被推导为int*
auto & c = x;           // int& auto被推导为int
auto   d = c;           // int  auto被推导为int

const auto e = x;       // int const   auto被推导为int
auto   f = e;           // int         auto被推导为int
const auto & g = x;     // int const & auto被推导为int
auto & h = g;           // int const & auto被推导为int const

const auto * gg = &x;   // int const * auto被推导为int
auto * hh = gg;         // int const * auto被推导为int const

  由上面的例子可以看出:

  • a和c的推导结果是很显然的, auto在编译的时候被替换为int, 因此a和c分别被推导为int*和int&.
  • b的推导结果说明, 其实auto不声明为指针, 也可以推导出指针类型.
  • d的推导结果说明, 当表达式是一个引用类型时, auto会把引用类型抛弃, 直接推导成原始类型int.
  • e的推导结果说明, 当表达式带有const(实际上volatile也会得到同样的结果)属性时, auto会把const属性抛弃掉, 推导成non-const类型int.
  • g/h的推导说明, 当auto和引用(换成指针在这里也将得到同样的结果, 如:用gg推导hh)结合时, auto的推导将保留表达式的const属性.

通过上面一系列示例, 可以得到下面两条规则:

  1. 当不声明为指针或引用时, auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致.
  2. 当声明为指针或引用时, auto的推导结果将保持初始化表达式的cv属性.

标签:11,const,推导,int,auto,代码优化,declaration,类型
来源: https://www.cnblogs.com/dog-pi/p/16519517.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有