当前位置: 首页 > 编程日记 > 正文

C++11中auto的使用

在C语言中,就有了auto关键字,它被当作是一个变量的存储类型修饰符,表示自动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。在C++11标准中,添加了新的类型推导特性。在C ++11中,使用auto定义的变量不能使用其它类型修饰符修饰,该变量的类型由编译器根据初始化数据自动确定。

C++中类型检查是在编译阶段。动态类型语言能做到在运行时决定类型,主要归功于一技术,这技术是类型推导。在C++11中,可以通过重定义auto关键字来实现类型推导。

在C++11中,使用auto关键字可以要求编译器对变量的类型进行自动推导。

auto关键字:类型推导,从该关键字的初始化表达式中推导变量的类型。

在块作用域、命名空间作用域、for循环的初始化语句内声明变量的时候,变量的类型可以被省略,使用关键字auto来代替。

auto声明的变量必须被初始化,以使编译器能够从其初始化表达式中推导出其类型。

声明为auto的变量在编译时期就分配了内存,而不是到了运行时期,所以使用auto不再引发任何速度延迟,这也意味着使用auto的时候,这个变量不初始化会报错,因为编译器无法知道这个变量的类型。

auto使用时需注意:

(1)、可以使用const、volatile、pointer(*)、reference(&)、rvalue reference(&&)等说明符和声明符来修饰auto关键字;

(2)、用auto声明的变量必须初始化;

(3)、auto不能与其它任何类型说明符一起使用;

(4)、方法、参数或模板参数不能被声明为auto;

(5)、定义在堆上的变量,使用了auto的表达式必须被初始化;

(6)、auto是一个占位符,不是类型,不能用于类型转换或其它一些操作,如sizeof、typeid;

(7)、auto关键字内声明的声明符列表的所有符号必须解析为同一类型;

(8)、auto不能自动推导成CV-qualifiers(constant& volatile qualifiers),除非被声明为引用类型;

(9)、auto会退化成指向数组的指针,除非被声明为引用;

(10)、auto不能作为函数的返回类型,在C++14中是可以的。

建议:大多数情况使用关键字auto,除非非常需要转换。

下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

#include "auto.hpp"
#include <iostream>
#include <cmath>
#include <typeinfo>
#include <string>
#include <map>
#include <list>
#include <deque>
#include <vector>//
// reference: http://en.cppreference.com/w/cpp/language/auto
template<class T, class U>
auto add(T t, U u) -> decltype(t + u) // the return type is the type of operator+(T, U)
{return t + u;
}auto get_fun(int arg) -> double(*)(double) // same as: double (*get_fun(int))(double)
{switch (arg) {case 1: return std::fabs;case 2: return std::sin;default: return std::cos;}
}int test_auto1()
{auto a = 1 + 2;std::cout << "type of a: " << typeid(a).name() << '\n'; // type of a: intauto b = add(1, 1.2);std::cout << "type of b: " << typeid(b).name() << '\n'; // type of b: doubleauto c = { 1, 2 };std::cout << "type of c: " << typeid(c).name() << '\n'; // type of c: class std::initializer_list<int>auto my_lambda = [](int x) { return x + 3; };std::cout << "my_lambda: " << my_lambda(5) << '\n'; // my_lambda: 8auto my_fun = get_fun(2);std::cout << "type of my_fun: " << typeid(my_fun).name() << '\n'; // type of my_fun: double (__cdecl*)(double)std::cout << "my_fun: " << my_fun(3) << '\n'; // my_fun: 0.14112// auto int x; // error as of C++11: "auto" is no longer a storage-class specifier // error C3530: “auto”不能与任何其他类型说明符组合return 0;
}// reference: https://msdn.microsoft.com/zh-cn/library/dd293667(v=vs.120).aspx
int f(int x) { return x; }int test_auto2()
{int count = 10;int& countRef = count;auto myAuto = countRef;countRef = 11;std::cout << count << " " << std::endl; // 11myAuto = 12;std::cout << count << std::endl; // 11// 1. 下面的声明等效。 在第一个语句中,声明 j 变量为类型 int。 在第二个语句,因为初始化表达式 (0) 是整数,所以变量 k 推导为 int 类型int j = 0;  // Variable j is explicitly type int.auto k = 0; // Variable k is implicitly type int because 0 is an integer.// 2. 以下声明等效,但第二个声明比第一个简单std::map<int, std::list<std::string>> m;std::map<int, std::list<std::string>>::iterator i = m.begin();auto i_ = m.begin();// 3. 声明 iter 和 elem 变量类型std::deque<double> dqDoubleData(10, 0.1);for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter) { /* ... */}// prefer range-for loops with the following information in mind// (this applies to any range-for with auto, not just deque)for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples { /* ... */ }for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE{ /* ... */ }for (const auto& elem : dqDoubleData) // observes elements IN-PLACE{ /* ... */ }// 4. 使用 new 运算符double x = 12.34;auto *y = new auto(x), **z = new auto(&x);// 5. 所有符号解析为同一类型auto x_ = 1, *y_ = &x_, **z_ = &y_; // Resolves to int.auto a(2.01), *b(&a);         // Resolves to double.auto c = 'a', *d(&c);          // Resolves to char.auto m_ = 1, &n_ = m_;            // Resolves to int.// 6. 使用条件运算符 (?:)int v1 = 100, v2 = 200;auto e = v1 > v2 ? v1 : v2;// 7. 将变量 x7 初始化类型 int,将引用的变量 y7 初始化为类型 const int,及将变量 fp 初始化为指向返回类型 int 的函数的指针auto x7 = f(0);const auto & y7 = f(1);int(*p)(int x7);p = f;auto fp = p;return 0;
}/
// reference: http://www.learncpp.com/cpp-tutorial/4-8-the-auto-keyword/
int add_3(int x, int y)
{return x + y;
}int test_auto3()
{auto d = 5.0; // 5.0 is a double literal, so d will be type doubleauto i = 1 + 2; // 1 + 2 evaluates to an integer, so i will be type intauto sum = add_3(5, 6); // add_3() returns an int, so sum will be type intreturn 0;
}

GitHub:https://github.com/fengbingchun/Messy_Test

相关文章:

攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗

AI技术的发展为网络安全带来新机遇的同时&#xff0c;黑客也在逐渐利用AI漏洞建立对抗样本以躲避攻击&#xff0c;双方在各自领域的更多尝试也将是AI技术发展的一场新博弈。那么&#xff0c;在应用中&#xff0c;如何利用AI检测技术与恶意软件展开对抗&#xff1f; 腾讯安全技术…

一文看懂机器学习中的常用损失函数

作者丨stephenDC编辑丨zandy来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;导语&#xff1a;损失函数虽然简单&#xff0c;却相当基础&#xff0c;可以看做是机器学习的一个组件。机器学习的其他组件&#xff0c;还包括激活函数、优化器、模型等。本文针对机…

Using Apache2 with JBoss AS7 on Ubuntu

大体思路同《Using Apache Web Server with Jboss AS 7》一致&#xff0c;但在Ubuntu上的操作与之前有些区别。 这里仍然演示mod_proxy的配置。 首先加载相应的模块。Ubuntu中加载模块和卸载模块均可以通过命令操作&#xff0c;与其对应的命令分别是a2enmod和a2dismod。 启用…

OpenCV代码提取:rotate函数的实现

OpenCV中并没有直接提供实现rotate的函数&#xff0c;这里通过getRotationMatrix2D和warpAffine函数实现rotate&#xff0c;并增加了一个crop参数&#xff0c;用来判断是否进行crop。目前支持uchar和float两种类型&#xff0c;经测试&#xff0c;与OpenCV3.1结果完全一致。公式…

在 Node.js 中用子进程操作标准输入/输出

翻译&#xff1a;疯狂的技术宅原文&#xff1a;http://2ality.com/2018/05/chi... 本文首发微信公众号&#xff1a;jingchengyideng欢迎关注&#xff0c;每天都给你推送新鲜的前端技术文章 在本中&#xff0c;我们在 Node.js 中把 shell 命令作为子进程运行。然后异步读取这些进…

再见,Python 2.x

整理 | 屠敏来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;在技术的长河中&#xff0c;软件、工具、系统等版本的迭代本是常事&#xff0c;但由于使用习惯、版本的兼容性、易用性等因素&#xff0c;很多用户及开发者在使用或做开发的过程中&#xff0c;并不愿意及…

Android UI系列-----CheckBox和RadioButton(1)

主要记录一下CheckBox多选框和RadioGroup、RadioButton单选框的设置以及注册监听器 1.CheckBox 布局文件&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android…

C++中struct的使用

C语言继承了C语言的struct&#xff0c;并且加以扩充。在C语言中struct是只能定义数据成员&#xff0c;而不能定义成员函数的。而在C中&#xff0c;struct类似于class&#xff0c;在其中既可以定义数据成员&#xff0c;又可以定义成员函数。结构类型是用户定义的复合类型&#x…

填报表中也可以添加 html 事件

在实际的项目开发中&#xff0c;填报表的应用十分广泛。 多数情况下&#xff0c;填报表会作为整个项目的一部分配合需求灵活使用&#xff0c;但有时也会受大项目环境的影响&#xff0c;产生一些特别的要求。比如&#xff0c;通常报表单元格的数据类型大多是文本&#xff0c;有时…

60+业内技术专家,9大核心技术专题,AI ProCon倒计时一周!

2018 年&#xff0c;由 CSDN 举办的第一届 AI 开发者大会喊出“只讲技术&#xff0c;拒绝空谈”&#xff0c;两天会议时间&#xff0c;国内外几十家顶尖科技企业讲述了其主流技术及其应用案例&#xff0c;真正引领国内开发者紧跟技术浪潮。一年过去&#xff0c;在你还未有所觉察…

密码学研究-数字签名

引入&#xff1a;提到签名&#xff0c;大家都不陌生&#xff0c;大家知道&#xff0c;重大的文件一般都要领导签名&#xff0c;来确保这个文件的真实有效。而一些比较重要的合同&#xff0c;比如买房的购房合同&#xff0c;都要盖“骑缝章”&#xff0c;这个骑缝章&#xff0c;…

C++11中shared_ptr的使用

在C中&#xff0c;动态内存的管理是通过一对运算符来完成的&#xff1a;new&#xff0c;在动态内存中为对象分配空间并返回一个指向该对象的指针&#xff0c;可以选择对对象进行初始化&#xff1b;delete&#xff0c;接受一个动态对象的指针&#xff0c;销毁该对象&#xff0c;…

colly源码学习

colly源码学习 colly是一个golang写的网络爬虫。它使用起来非常顺手。看了一下它的源码&#xff0c;质量也是非常好的。本文就阅读一下它的源码。 使用示例 func main() {c : colly.NewCollector()// Find and visit all linksc.OnHTML("a[href]", func(e *colly.HTM…

可惜了,你们只看到“双马会”大型尬聊

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;2019 年 8 月 29 日&#xff0c;世界人工智能大会&#xff08;WAIC&#xff09;在上海正式拉开帷幕。开幕式上&#xff0c;最让人瞩目的莫过于阿里巴巴前 CEO 马云与特斯拉 CEO Elon Musk …

Java 过滤特殊字符的 正则表达式

Java正则表达式学习&#xff1a; 因为正则表达式是一个很庞杂的体系&#xff0c;此例仅举些入门的概念&#xff0c;更多的请参阅相关书籍及自行摸索。 \\ 反斜杠 \t 间隔 (\u0009) \n 换行 (\u000A) \r 回车 (\u000D) \d 数字 等价于[0-9] \D 非数字 等价于[^0-9] \s 空…

C++11中unique_ptr的使用

在C中&#xff0c;动态内存的管理是通过一对运算符来完成的&#xff1a;new&#xff0c;在动态内存中为对象分配空间并返回一个指向该对象的指针&#xff0c;可以选择对对象进行初始化&#xff1b;delete&#xff0c;接受一个动态对象的指针&#xff0c;销毁该对象&#xff0c;…

从这篇YouTube论文,剖析强化学习在工业级场景推荐系统中的应用

作者 | 吴海波转载自知乎用户吴海波【导读】本文作者根据两篇工业界背景的论文解答了 RL 在推荐场景需要解决的问题与困难&#xff0c;以及入门需要学习得相关知识点。2 个月前&#xff0c;业界开始流传 youtube 成功将 RL 应用在了推荐场景&#xff0c;并且演讲者在视频中说是…

java中两个Integer类型的值相比较的问题

转载自&#xff1a; https://www.cnblogs.com/xh0102/p/5280032.html 两个Integer类型整数进行比较时&#xff0c;一定要先用intValue()方法将其转换为int数之后再进行比较&#xff0c;因为直接使用比较两个Integer会出现问题。 总结&#xff1a; 当给Integer直接赋值时&#x…

C#共享内存实例 附源码

原文 C#共享内存实例 附源码 网上有C#共享内存类&#xff0c;不过功能太简单了&#xff0c;并且写内存每次都从开头写。故对此进行了改进&#xff0c;并做了个小例子&#xff0c;供需要的人参考。 主要改进点&#xff1a; 通过利用共享内存的一部分空间(以下称为“数据信息区”…

C++11中weak_ptr的使用

在C中&#xff0c;动态内存的管理是通过一对运算符来完成的&#xff1a;new&#xff0c;在动态内存中为对象分配空间并返回一个指向该对象的指针&#xff0c;可以选择对对象进行初始化&#xff1b;delete&#xff0c;接受一个动态对象的指针&#xff0c;销毁该对象&#xff0c;…

经典不过时,回顾DeepCompression神经网络压缩

作者 | 薰风初入弦转载自知乎导读&#xff1a;本文作者为我们详细讲述了 ICLR 2016 的最佳论文 Deep Compression 中介绍的神经网络压缩方法。神经网络压缩一直是一个重要的研究方向&#xff0c;而目前业界最认可的压缩方法莫过于 ICLR 2016 的最佳论文 Deep Compression&#…

区块链技术特点之去中心化特性

想知道更多关于区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客&#xff0c;有问必答&#xff01;&#xff01; 由于区块链技术去中心化的特性&#xff0c;其在我们生活中的很多重要领域&#xff08;如金融、管理&#xff09;等方面具有重要的意义。例如&…

Android APK反编译

转自&#xff1a;http://blog.csdn.net/ithomer/article/details/6727581 一、Apk反编译得到Java源代码 下载上述反编译工具包&#xff0c;打开apk2java目录下的dex2jar-0.0.9.9文件夹&#xff0c;内含apk反编译成java源码工具&#xff0c;以及源码查看工具。 apk反编译工具dex…

Java泛型进阶 - 如何取出泛型类型参数

在JDK5引入了泛型特性之后&#xff0c;她迅速地成为Java编程中不可或缺的元素。然而&#xff0c;就跟泛型乍一看似乎非常容易一样&#xff0c;许多开发者也非常容易就迷失在这项特性里。多数Java开发者都会注意到Java编译器的类型擦除实现方式&#xff0c;Type Erasure会导致关…

C++11中override的使用

override是C11中的一个继承控制关键字。override确保在派生类中声明的重载函数跟基类的虚函数有相同的声明。 override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是&#xff0c;它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配&#xff…

平头哥发布一站式芯片设计平台“无剑”,芯片设计成本降低50%

导读&#xff1a;8 月 29 日&#xff0c;在上海举行的世界人工智能大会上&#xff0c;阿里巴巴旗下半导体公司平头哥发布 SoC 芯片平台“无剑”。无剑是面向 AIoT 时代的一站式芯片设计平台&#xff0c;提供集芯片架构、基础软件、算法与开发工具于一体的整体解决方案&#xff…

Windows XP下,JDK环境变量配置

2019独角兽企业重金招聘Python工程师标准>>> 1.安装JDK&#xff0c;安装过程中可以自定义安装目录等信息&#xff0c;例如我们选择安装目录为D:\java\jdk1.5.0_08&#xff1b; 2.安装完成后&#xff0c;右击“我的电脑”&#xff0c;点击“属性”&#xff1b; 3.选择…

Markdown语法简介

Markdown是一种方便记忆、书写的纯文本标记语言&#xff0c;用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档。它目标是实现易读易写。Markdown的语法全由一些符号所组成。Markdown语法的目标是成为一种适用于网络的书写语言。 Markdown优点&#xff1a;纯文本…

吴恩达:AI未来将呈现四大发展趋势

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;8 月 30 日&#xff0c;世界人工智能大会精彩继续。在今天的全球工业智能峰会上&#xff0c;Landing.AI 创始人及首席执行官吴恩达来到现场&#xff0c;做了题为《人工智能是新电力》的演讲…

嵌入式课程安排 嵌入式培训课程大纲参考

嵌入式是一门综合性的学科&#xff0c;现在学习嵌入式开发不是单纯局限于单片机或者Linux&#xff0c;嵌入式课程中包含着非常多的内容。以粤嵌嵌入式课程进行参考&#xff0c;看看我们要学习嵌入式的话&#xff0c;要掌握哪些必备的技能。嵌入式课程安排包含&#xff1a;1、入…