C++教程之auto关键字的使用

一、auto关键字的前世

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

#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

二、auto关键字的今生

在C++ 11标准中,添加了新的类型推导特性,考虑到auto关键字很少使用,就给它重新赋予了功能——申明类型由编译器推导的变量。在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语言中的使用!

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

时间: 2024-11-09 00:21:44

C++教程之auto关键字的使用的相关文章

学java教程之this关键字

学编程吧学java教程之this关键字发布了,欢迎通过xuebiancheng8.com来访问 java中的this关键字是一个非常重要的关键词.java中的this关键词主要有两种用法,先看第一种 public class Person{ private String username; private int age; public Person(String username,int age){ this.username = username; this.age = age; } } 在

Kail Linux渗透测试教程之ARP侦查Netdiscover端口扫描Zenmap与黑暗搜索引擎Shodan

Kail Linux渗透测试教程之ARP侦查Netdiscover端口扫描Zenmap与黑暗搜索引擎Shodan ARP侦查工具——Netdiscover Netdiscover是一个主动/被动的ARP侦查工具.该工具在不使用DHCP的无线网络上非常有用.使用Netdiscover工具可以在网络上扫描IP地址,检查在线主机或搜索为它们发送的ARP请求.下面将介绍Netdiscover工具的使用方法. 首先查看下Netdiscover工具的帮助信息,执行命令如下所示: [email protect

Tkinter教程之Scale篇

本文转载自:http://blog.csdn.net/jcodeer/article/details/1811313 '''Tkinter教程之Scale篇'''#Scale为输出限定范围的数字区间,可以为之指定最大值,最小值及步距值'''1.创建一个Scale'''from Tkinter import *root = Tk()Scale(root).pack()root.mainloop()#创建一个垂直Scale,最大值为100,最小值为0,步距值为1.这个参数设置也就是Scale的缺省设

BIOS设置图解教程之Award篇

(目前主板上常见的BIOS主要为AMI与AWARD两个系列,如何辨别BIOS品牌系列请移步,本文详细讲解Award系列的BIOS设置图解教程,如果你的BIOS为AMI系列请移步 BIOS设置图解教程之AMI篇,文中重要的部分已经标红,快速阅读请配合图片查阅红色加速字体即可)介绍了AMI Bios设置后.我们再来介绍一下Award的Bios设置,其实Award Bios和AMI Bios里面有很多东西是相同的,可以说基本上是一样的,虽然有些名字叫法不同,但是实际作用是一样的.在前文中已经了解了一些

BIOS设置图解教程之AMI篇

(目前主板上常见的BIOS主要为AMI与AWARD两个系列,如何辨别BIOS品牌系列请移步,本文详细讲解AMI系列的BIOS设置图解教程,如果你的BIOS为AWARD系列请移步 BIOS设置图解教程之Award篇,文中重要的部分已经标红,快速阅读请配合图片查阅红色加速字体即可)对于很多初学者来说,BIOS设置是一件非常头疼的事情,面对着满屏的E文,实在是无从下手.但是,设置BIOS在高手的眼里,却什么也算不上.当你看着高手的指尖在键盘上熟练的跳动,而蓝色屏幕里的字符不停的变换,你一定很羡慕,不是

iOS 9应用开发教程之ios9中实现按钮的响应

iOS 9应用开发教程之ios9中实现按钮的响应 IOS9实现按钮的响应 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应:另一种是使用代码添加按钮实现的响应. 1.编辑界面添加按钮实现的响应 使用编辑界面添加按钮可以使用拖动的方式来实现按钮的响应,它也是最简单的一种实现响应的方式. [示例2-4]以下将实现轻拍按钮,改变主视图背景颜色的功能.具体的操作步骤如下: (1)创建一个Single View Application

ios系类教程之用instruments来检验你的app

ios系类教程之用instruments来检验你的app 为了节省大家的时间,提供一个演示的Demo给大家.代码传送门.下载后解压然后用xcode打开.编译运行APP后 然后在搜索框内输入任意词汇,点击结果你会看到下面的结果 正如你所见的,这个app很简单.程序其实调用的是Flickr的API,通过app顶部的搜索框执行搜索后在下面的tableview显示你搜索的搜索词,搜索词后面的括号内有搜索结果的个数,点击此行进入一个略所图的结果列表页面 如上图. 点击其中一行 进入图像的大图模式,在这个页

Python基础教程之List对象 转

Python基础教程之List对象 时间:2014-01-19    来源:服务器之家    投稿:root 1.PyListObject对象typedef struct {    PyObject_VAR_HEAD    PyObject **ob_item;    Py_ssize_t allocated;} PyListObject; PyObject_VAR_HEAD中的obsize表示该list对象含有的元素个数, 而allocated表示该list对象占用的内存空间. ob_item

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

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