一、autokeyword的前世

从C语言開始,autokeyword就被当作是一个变量的存储类型修饰符,表示自己主动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。

#include <stdio.h>

int main()
{
int a = 123;
auto int b = 234;
auto c = 345; printf("a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}

编译执行结果:

$ gcc main.c
main.c:7:7: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
auto c = 345;
~~~~ ^
1 warning generated.
$ ./a.out
a = 123, b = 234, c = 345

二、autokeyword的今生

在C++ 11标准中,加入了新的类型推导特性,考虑到autokeyword非常少使用,就给它又一次赋予了功能——申明类型由编译器推导的变量。

在C++
11中。使用auto定义的变量不能使用其他类型修饰符修饰,该变量的类型由编译器依据初始化数据自己主动确定。auto类型的变量必须进行初始化。

#include <iostream>

int main()
{
int a = 21;
auto b = a; //typeid能够获取变量或者数据类型的名字
std::cout << typeid(b).name() << std::endl; return 0;
}

1 .使用C++ 98标准进行编译,会出现警告:

$ clang++ main.cpp -std=c++98
main.cpp:6:2: warning: 'auto' type specifier is a C++11 extension
[-Wc++11-extensions]
auto b = a;
^
1 warning generated.
$ ./a.out
i #输出结果为整数类型

改用C++ 11进行编译:

$ clang++ main.cpp -std=c++11
$ ./a.out
i

2 .可是假设还是将auto作为存储类型修饰符使用,则在C++
11标准下会出现警告:

#include <iostream>

int main()
{
int a = 21;
auto int b = a; //typeid能够获取变量或者数据类型的名字
std::cout << typeid(b).name() << std::endl; return 0;
}

使用C++ 98编译:

$ clang++ main.cpp -std=c++98
$ ./a.out
i

改用C++ 11编译,出现警告,不再同意作为存储类型修饰符使用:

$ clang++ main.cpp -std=c++11
main.cpp:6:2: warning: 'auto' storage class specifier is not permitted in C++11,
and will not be supported in future releases [-Wauto-storage-class]
auto int b;
^~~~~
1 warning generated.

3 .必需要对auto类型的变量进行初始化,C++
98中不能单独使用auto定义变量。

$ clang++ main.cpp -std=c++98
main.cpp:6:2: warning: 'auto' type specifier is a C++11 extension
[-Wc++11-extensions]
auto b;
^
main.cpp:6:7: error: declaration of variable 'b' with type 'auto' requires an
initializer
auto b;
^
1 warning and 1 error generated.
$ clang++ main.cpp
main.cpp:6:2: warning: 'auto' type specifier is a C++11 extension
[-Wc++11-extensions]
auto b;
^
main.cpp:6:7: error: declaration of variable 'b' with type 'auto' requires an
initializer
auto b;
^
1 warning and 1 error generated.

三、扩展

在C++中还能使用decltype来获取变量或者表达式的类型并用来定义新的变量。

#include <iostream>

int main()
{
int a = 21;
decltype(a) b; std::cout << typeid(b).name() << std::endl; return 0;
}

编译执行结果:

$ clang++ main.cpp -std=c++98
$ ./a.out
i
$ clang++ main.cpp -std=c++11
$ ./a.out
i

须要注意的是该标准仅仅是改变了C++中auto的使用方法。可是并没有影响auto在C语言中的使用!

本文档由长沙戴维营教育整理。

C++教程之autokeyword的使用的更多相关文章

  1. [转]搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速

    搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速 有的同学反映自己的搬瓦工速度慢,丢包率高.这其实和你的网络服务提供商有关.据我所知一部分上海电信的同学就有这种问题.那么碰到了坑爹的网络服务 ...

  2. jQuery EasyUI教程之datagrid应用(三)

    今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...

  3. jQuery EasyUI教程之datagrid应用(二)

    上次写到了让数据库数据在网页datagrid显示,我们只是单纯的实现了显示,仔细看的话显示的信息并没有达到我们理想的效果,这里我们丰富一下: 上次显示的结果是这样的 点击查看上篇:jQuery Eas ...

  4. jQuery EasyUI教程之datagrid应用(一)

    最近一段时间都在做人事系统的项目,主要用到了EasyUI,数据库操作,然后抽点时间整理一下EasyUI的内容. 这里我们就以一个简洁的电话簿软件为基础,具体地说一下datagrid应用吧 datagr ...

  5. kali linux 系列教程之metasploit 连接postgresql可能遇见的问题

    kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂   目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...

  6. kali Linux系列教程之BeFF安装与集成Metasploit

    kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...

  7. Kali Linux系列教程之OpenVas安装

    Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装 前言 1.  服务器层组件 2.客户层组件 安装过程 Initial setup ...

  8. Playmaker Input篇教程之PlayMaker菜单概述

    Playmaker Input篇教程之PlayMaker菜单概述 Playmaker InputPlayMaker菜单概述 Playmaker插件被导入游戏项目以后,会自动为Unity编辑器添加一个名 ...

  9. Playmaker Input篇教程之Playmaker购买下载和导入

    Playmaker Input篇教程之Playmaker购买下载和导入 Playmaker Input篇认识Playmaker Playmaker是Unity的插件,其标志如图1-1所示.开发者使用它 ...

随机推荐

  1. 06.十分钟学会表达式语言EL

    一. 概念:MVC设计模式一个主要好处就是让jsp中的代码越来越来少,而且规定只能出现三种代码:接收属性,判断语句,迭代输出.但是,在开发中,jsp输出至少还是需要接受VO对象的,这时候为了避免导入V ...

  2. 10.javaweb核心标签库详解

    一.JSTL简介及在项目中安装配置 1,  简介 使用JSTL标签的目的就是不希望jsp中出现java逻辑代码 分类 2,  JSTL的安装配置 首先将jar包中的各个标签库配置文件拷贝到项目WEB- ...

  3. word中表格第一列序号的设置

    表格中序号问题 1.新建一个表格.第一列选择编号后,编号后有tab,如下图 2.选中表格的编号,点击新建列表样式, 3.将编号后的字符改成nothing,在将单元格改成居中即可 4.在将单元格改成居中 ...

  4. javascript正则多次调用test 结果交替出现

    现在需要一个正则验证小数点后保留一到三位数,小数点前只能两位或一位整数的这么一个数. 正则如: var reg = /^\d{,}\.\d{,}$/g; 验证如下: 因为我们用1.23符合规则的数据去 ...

  5. Python的__main__.py用法

    [背景] 在看flower的时候看到__main__.py文件,不知道具体做什么用? 故先进行测试看看. [测试代码] 测试代码目录结构如下: . `-- test |-- __init__.py | ...

  6. Centos 6.9 安装 Redis 3.2.9

    依赖包和常用包yum install gcc gcc-c++ make zlib-devel readline readline-devel tkutil tk tkutil-devel tk-dev ...

  7. 线程&进程&协程

    线程 线程是应用程序中工作的最小单元,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.Threading用 ...

  8. CentOS 7 yum 安装ownCloud 搭建云盘服务器

    基于CentOS7.0 64位系统+ownCloud 10.0 稳定版本构建 ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可 ...

  9. 问题(一)---线程池,锁、堆栈和Hashmap相关

    一.线程池: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中 ...

  10. c语言的typedef

    一.typedef作用简介 1.作用:给已经存在的类型起一个新的名称 2.使用场合: 1> 基本数据类型 2> 指针 3> 结构体 4> 枚举 5> 指向函数的指针 * ...