auto和decltype的使用

  • auto
    • auto使用的限制
    • auto 的推导规则
  • decltype
    • decltype 的推导规则
  • auto和decltype的配合使用

auto

C++编程时,常常需要把表达式的值赋给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易,有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值。如下所示:

auto i; // error: declaration of variable 't' with deduced type 'auto' requires an initializer
//因此我们在使用auto时,必须对该变量进行初始化。auto i= 0; //0为int类型,auto自动推导出int类型
auto j = 2.0; //auto 自动推导出类型为floatint a = 0;
auto b = a; //a 为int类型
auto &c = a; //c为a的引用
auto *d = &a; //d为a的指针
auto i = 1, b = "hello World"; //error: 'auto' deduced as 'int' in declaration of 'i' and deduced as 'const char *' in declaration of 'b'/* auto 作为成员变量的使用*/
class test_A
{public:test_A() {}auto a = 0; //error: 'auto' not allowed in non-static class memberstatic auto b = 0; //error: non-const static data member must be initialized out of linestatic const auto c = 0;
};/*c11 中的使用*/
auto func = [&] {cout << "xxx";
};
// 不关心lambda表达式究竟是什么类型
auto asyncfunc = std::async(std::launch::async, func);
// 懒得写std::futurexxx等代码

auto使用的限制

  1. auto的使用必须马上初始化,否则无法推导出类型
  2. auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败
  3. auto不能用作函数参数
  4. 在类中auto不能用作非静态成员变量
  5. auto不能定义数组,可以定义指针
  6. auto无法推导出模板参数

auto 的推导规则

  1. 在不声明为引用或指针时,auto会忽略等号右边的引用类型和const、volatile限定
  2. 在声明为引用或者指针时,auto会保留等号右边的引用和const、volatile属性
    const int a = 0;auto b = a;auto &c = a;c = 3; //error: cannot assign to variable 'c' with const-qualified type 'const int &'//note: variable 'c' declared const here

decltype

decltype用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算

int fun(){ return 0; }
decltype(fun()) a;
decltype(fun()) b = 5;int fun2(int a){ return 0; }
int c = 0;
decltype(fun2(c)) a;
decltype(fun2(c)) b = 5;

注意:decltype不会像auto一样忽略引用和const、volatile属性,decltype会保留表达式的引用和const、volatile属性

decltype 的推导规则

对于decltype(exp)有:

  1. exp是表达式,decltype(exp)和exp类型相同
  2. exp是函数调用,decltype(exp)和函数返回值类型相同
  3. 其它情况,若exp是左值,decltype(exp)是exp类型的左值引用
int a = 0, b = 0;
decltype(a + b) c = 0; // c是int,因为(a+b)返回一个右值
decltype(a += b) d = c;// d是int&,因为(a+=b)返回一个左值d = 20;
cout << "c " << c << endl; // 输出c 20

auto和decltype的配合使用

auto和decltype一般配合使用在推导函数返回值的类型问题上。事例如下:

template<typename , typename U>
return_value add(T t, U u) { // t和v类型不确定,无法推导出return_value类型return t + u;
}

上面代码由于t和u类型不确定,那如何推导出返回值类型呢,我们可能会想到这种

template<typename T, typename U>
decltype(t + u) add(T t, U u) { // t和u尚未定义return t + u;
}

这段代码在C++11上是编译不过的,因为在decltype(t +u)推导时,t和u尚未定义,就会编译出错,所以有了下面的叫做返回类型后置的配合使用方法:

template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {return t + u;
}

返回值后置类型语法就是为了解决函数返回值类型依赖于参数但却难以确定返回值类型的问题。

C++11 auto 和decltype的使用相关推荐

  1. C++11 auto和decltype关键字

    auto 可以用 auto 关键字定义变量,编译器会自动判断变量的类型.例如: auto i =100; // i 是 int auto p = new A(); // p 是 A* auto k = ...

  2. C++11新特性——auto和decltype

    一.auto和decltype 1.auto和decltype都是C++11新增的关键字,都用于类型自动推导. 类型格式 auto varname = value; //auto的语法格式 declt ...

  3. C++11 新增关键字decltype学习

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

  4. C++11新特性decltype

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105042574 C ...

  5. 《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结

    1.using和typedef(作用:定义类型别名) 1)typedef和using都可以用来定义一个类型别名,二者在类型别名上定义没有区别.只是需要注意的是类型和类型别名的顺序,使用typedef定 ...

  6. C++ auto和decltype关键字

    可以用 auto 关键字定义变量,编译器会自动判断变量的类型.例如: auto i =100; // i 是 int auto p = new A(); // p 是 A* auto k = 3434 ...

  7. stdmove 跟 左键引用 区别_C++ auto和decltype的区别

    通过<C++ auto>和<C++ decltype>两节的学习,相信大家已经掌握了 auto 和 decltype 的语法规则以及使用场景,这节我们将 auto 和 decl ...

  8. C++11之后的decltype类型指示符

    C++11之后的decltype类型指示符 一.什么是decltype类型指示符 二.typeid运算符 三.使用decltype指示符 四.decltype和引用 五.decltype(auto) ...

  9. c++11新特性--decltype

    返回值 decltype(表达式) [返回值的类型是表达式参数的类型] 这个可也用来决定表达式的类型,就像Bjarne暗示的一样,如果我们需要去初始化某种类型的变量,auto是最简单的选择,但是如果我 ...

最新文章

  1. PyTorch 学习笔记(四):权值初始化的十种方法
  2. MyEclipse在保存时总是building workspace,反应很慢
  3. Android 项目集成腾讯X5浏览器内核
  4. QT的QStandardItemModel类的使用
  5. python自学行吗-自学python有用吗?
  6. PyTorch1.2.0版本来啦!居然还有全套视频!让你快速熟练掌握深度学习框架!
  7. STM32 高级定时器 输出PWM波
  8. 机器学习与数据挖掘的学习路线图
  9. golang中的URL 的编码和解码(转)
  10. mongodb 5.文章评论
  11. linux怎样编译安装pidgin,如何在Ubuntu中通过编译源码包安装软件Pidgin
  12. ffmpeg截取视频指定帧方法
  13. Spring Boot 实现定时任务
  14. Sequence的层次化
  15. 【QQ邮箱第三方客户端设置】Outlook登录QQ邮箱报错,解决方案。
  16. game.php中文什么意思,game是什么意思中文翻译
  17. rpgmaker是c语言编程吗,一起学rpgmaker脚本(1)【程序猿都能看懂的RGSS入门'`,、('∀`) '`,、】...
  18. mcafee 杀毒软件防火墙下载和病毒库升级及设置教程
  19. [解读] You Only Train Once Loss-Conditional Training of Deep Networks
  20. 亚马逊---人工智能入门---学习笔记

热门文章

  1. WebBroker 制作网站
  2. 2.2计算圆柱体的体积.py
  3. 剑指Offer(第二版)面试题30:包含min函数的栈
  4. 5分钟搭建本地dns
  5. python把一个字符串拆分成多个字段_如何把一个字符串分割成多个字符串
  6. 感谢上帝又赐给我一个好妈妈
  7. 异物卡喉应如何正确诊疗
  8. 英语语法 -- 第一讲、语序和基本句式
  9. KgCaptcha 语序识别验证码请求日志记录
  10. Recover-Deleted-File