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. Zookeeper源码分析:主从角色关系流程概述
  2. centos7 php配置,CentOS7 下nginx与PHP的安装与配置
  3. springEL表达式
  4. 计算机的图形渲染机制
  5. JavaScript 中 window.setTimeout() 的详细用法
  6. ajax连mysql数据库_AJAX调用mysql数据库简单例子
  7. ICLR 2022 | 香侬科技提出基于图神经网络的语义理解模型,获单项满分
  8. find 按文件修改时间查找文件
  9. Device /dev/ttyUSB0 is locked.解决办法
  10. 【Linux】free命令查询服务器内存信息
  11. Lua4.0 实现#操作,获取table大小
  12. Node.js 修复4个漏洞
  13. 【笔记】双线性池化(Bilinear Pooling)详解、改进及应用
  14. python 写的第一个爬虫 下载网页视频,调用迅雷下载,男神喜欢
  15. python二级通过率_计算机二级考试通过率太低?别担心,是真正备考的人变少了...
  16. WINCC的一套教程 有视频 有VBS开发基础 Excel导出
  17. 基于Web在线考试系统的设计与实现
  18. python自动补全vim_Python 自动补全(vim)
  19. 深度学习工作站装机指南
  20. PgSql之操作JSON类型字段

热门文章

  1. Postgis使用工具raster2pgsql导入栅格数据
  2. [转]检查本地DNS服务器是否正常工作及解决方法
  3. 我要收拾心情,重新上路
  4. terminal, git代理设置
  5. 这是我见过最好的微服务 SaaS 快速开发平台。功能完整,代码结构清晰!
  6. 使用 WebSocket 连接 MQTT 服务器
  7. 怎么处理Win10系统更新提示代码0x80070057的错误?
  8. 5.论文学习A review of deep learning in medical imaging: Imaging traits, technology trends, case studies
  9. python截取子串_python字符串截取子串
  10. TCL语言入门与SynopsysTCL语言入门