4.auto与decltype

4.auto与decltype

auto

1.auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值。

2.使用auto也能在一个语句中声明多个变量,因为一个声明雨具只能有一个基本数据类型,所以该雨具所有变量的初始基本数据类型都必须是一样的。在这里一定要区别数据类型和类型修饰符!!

1. int i = 3;  

2. auto a = i,&b = i,*c = &i;//正确: a初始化为i的副本,b初始化为i的引用,c为i的指针.  

3. auto sz = 0, pi = 3.14;//错误,两个变量的类型不一样。

3. auto会忽略引用,其次,auto一般会忽略掉顶层const,但底层const会被保留下来,比如当初始值是一个指向常量的指针时.


1. int x = 0;      

2. auto *a = &x;   //a的类型是int*,auto被推导为int  

3. auto b = &x;    //b的类型int*, auto被推导为int*      

4. auto &c = x;    //cx的引用,auto被推导为int  

5. auto d = c;     //dc的推导  auto被推导为int   

6. const auto e = x;   //e -> int auto 被推导为int  

7. auto f = e;         //f -> int auto被推导为int    

8. const auto & g = x; //g -> const int &   

9. auto &h = g;        //h -> const int &  

 

4. auto的限制

auto不能用于函数形参,哪怕是带默认参数的形参

auto不能修饰类或者结构体中的非静态成员

auto不能定义数组auto 不能作为模板参数

auto的使用

1. 用于遍历数组、容器

1. std::map<intint> m_map;     

2. for (auto it = m_map.begin(); it != m_map.end(); it++)  

3. {

4.      if(it == m_map.begin()+4)

5.           it = m_map.erase(it);

6.      else

7.          it++;

8. }  

2.  用于复杂表达式类型的推导

decltype

在编译时期推导出一个表达式的类型,而不用初始化,和sizeof一样,decltype推导表达式类型也是在编译时期就完成的,并不会真正的计算表达式的值

decltype永远推导出表达式的实际类型,不管你定义时是不是加了指针或者引用标记。

decltype(expr)的推导规则如下:

1、expr是标识符或者类访问表达式,decltype(expr)和expr的类型保持一致。

2、expr是函数调用,decltype(expr)和返回值类型一致。

3、expr是一个左值,则decltype(expr)是expr类型的左值引用,否则和expr类型一致。

具体参考博客:https://blog.csdn.net/hailong0715/article/details/53928128

decltype的应用

1. 在泛型编程中

2. 由表达式推导类型

3. 结合auto一起使用

 

auto与decltype区别

1.  auto会忽略引用,auto一般会忽略掉顶层const,但底层const会被保留下来

如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内)

2.   如果表达式的内容是解引用操作,则decltype将得到引用类型。正如我们所熟悉的那样,解引用指针可以得到指针所指对象,而且还可以给这个对象赋值。因此decltype(*p)的结果类型就是int&

3.   decltype使用的是一个不加括号的变量,那么得到的结果就是这个变量的类型。但是如果给这个变量加上一个或多层括号,那么编译器会把这个变量当作一个表达式看待,变量是一个可以作为左值的特殊表达式,所

以这样的decltype就会返回引用类型

4.  = 赋值运算符返回的是左值的引用。换句话意思就是说 decltype(i = b)  返回类型为 i 类型的引用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值