auto类型

C++11中引入的auto主要用于类型推导。auto在C++98中“存储类型指示符”的语义,由于使用极少且多余,该语义从C++11开始被删除。

auto类型推导用于从初始化表达式中推断出变量的数据类型,通过此方法可以有效简化代码:

Example:

//简化前的代码

for (std::vector<std::string>::iterator i = vs.begin(); i != vs.end(); i++)
{
//code
} //简化后的代码 for (auto i = vs.begin(); i != vs.end(); i++)
{
//code
}

上例中,auto能够自动推导出vs.begin()的类型,从而避免了冗长的类型说明。这个用法是我们大力推荐的。

当auto用于模板定义中,其“自适应”性会得到更充分的体现。

Example:

#include<iostream>

template<typename T1, typename T2>
double Sum(T1 & t1, T2 & t2) //从c++14起,也可以支持函数返回值类型设为auto,这种用法多用于编写库的开发人员。
{
auto s = t1 + t2; //s的类型会在模板实例化时被推导出来
return s;
} int main()
{
int a = 3;
long b = 5;
float c = 1.0f, d = 2.3f; auto e = Sum<int, long>(a, b); //s的类型被推导为long
auto f = Sum<float, float>(c, d); //s的类型被推导为float
std::cout << e << " " << f << std::endl; return 0;
} //编译选项:g++ -std=c++11 auto1.cpp

上例中,由于类型T1、T2要在模板实例化时才能确定,所以在Sum中将变量s的类型声明为auto。

auto可以与指针和引用结合起来使用,使用效果符合我们的想象。如下例所示:

Example:

#include<iostream>
#include<typeinfo> int main()
{
int x = 0;
int *y = &x; auto &b = x; //int&
auto c = y; //int*
auto *d = y; //int*
auto e = b; //int return 0;
} //编译选项:g++ -std=c++11 auto2.cpp

本例中,对于c、d两个变量而言,声明其为auto*或auto并没有区别。

而如果要使得auto声明的变量是另一个变量的引用,则必须使用auto&,如本例中的变量b。而本例中e没有带&,则被推导成int类型。正如我们所熟知的,使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。

其次,auto与const和volatile之间也存在着一些相互关系。const和volatile代表了变量的两种不同的属性:易失和常量。在c++标准中,它们常常被一起叫作cv限制符(cv-qualifier)。

在深入介绍auto和cv限定符连用之前,先介绍下C++11中的顶层const和底层const。顶层const(top-level const)表示指针本身是一个常量,而底层const(low-level const)表示指针所指的对象是一个常量。

更一般的,顶层const可以表示任意的对象是常量,这一点对于任何数据类型都适用,如算术类型、类、指针等。底层const则与指针和引用等复合类型的基本类型部分有关。

int i = 0;
int *const p1 = &i; //顶层const
const int ci = 42; //顶层const
const int *p2 = &ci; //底层const
const int *const p3 = p2; //右边的const是顶层const,左边的const是底层const
const int &r = ci; //用于声明引用的const都是底层const

同理,volatile与const的用法相似。

鉴于cv限制符的特殊性,C++11标准规定auto可以与cv限制符一起使用。在连用时,auto一般会忽略掉顶层const,同时底层const则会保留下来,比如当初始值时一个指向常量的指针时:

Example:

int i = 0;
const int ci = i, &cr = ci;
auto b = ci; //b:int(ci的顶层const特性被忽略掉了)
auto c = cr; //c:int(cr是ci的别名,ci本身是顶层const)
auto d = &i; //d:int *(整数的地址就是指向整数的指针)
auto e = &ci; //e:const int *(对常量对象取地址是一种底层const)

如果希望推断出auto类型是一个顶层const,需要明确指出:

const auto f = ci; //ci的推演类型是int,f是const int

同理volatile与auto连用的用法和const一致。

auto在使用上的限制:以下四种情况特点基本类似,人为观察很容易能够推导出auto所在位置应有的类型,但现有标准还不支持这样的方式。

Example:

#include<vector>
using namespace std; void fun(auto x = 1) //1:auto函数形参,无法通过编译
{} struct str
{
auto var = 10; //2:auto非静态成员变量,无法通过编译
}; int main()
{
char x[3];
auto y = x;
auto z[3] = x; //3:auto数组,无法通过编译 vector<auto> v = { 1 }; //4.auto模板参数(实例化时,)无法通过编译
return 0;
} //编译选项:g++ -std=c++11 auto3.cpp

auto类型-现代C++新特性的更多相关文章

  1. php函数名后冒号+数据类型(返回值类型限制/php新特性)

    在PHP7,一个新的功能,返回类型声明已被引入.返回类型声明指定的一个函数返回值的类型. int float bool string interfaces array callable 对象实例 如下 ...

  2. H5 和 CSS3 新特性

    博客地址:https://ainyi.com/52 H5 新特性 语义化标签:header.footer.section.nav.aside.article 增强型表单:input 的多个 type ...

  3. HTML5和CSS3新特性一览

    HTML5 1.HTML5 新元素 HTML5提供了新的元素来创建更好的页面结构: 标签 描述 <article> 定义页面独立的内容区域. <aside> 定义页面的侧边栏内 ...

  4. HTML5的新特性

    HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer. ...

  5. HTML5的十大新特性

    为了更好地处理今天的互联网应用,HTML5添加了很多新元素及功能,比如: 图形的绘制,多媒体内容,更好的页面结构,更好的形式 处理,和几个api拖放元素,定位,包括网页 应用程序缓存,存储,网络工作者 ...

  6. HTML5的几大新特性

    为了更好地处理今天的互联网应用,HTML5添加了很多新元素及功能,比如: 图形的绘制,多媒体内容,更好的页面结构,更好的形式 处理,和几个api拖放元素,定位,包括网页 应用程序缓存,存储,网络工作者 ...

  7. html5 新增元素以及css3新特性

    HTML5 1.HTML5 新元素 HTML5提供了新的元素来创建更好的页面结构: 标签 描述 <article> 定义页面独立的内容区域. <aside> 定义页面的侧边栏内 ...

  8. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  9. 【C++11】新特性——auto的使用

    [C++11]新特性——auto的使用 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后 ...

随机推荐

  1. struts1的配置文件详解

    要想使用Struts,至少要依靠两个配置文件:web.xml和struts-config.xml.其中web.xml用来安装Struts框架.而struts-config.xml用来配置在Struts ...

  2. HTML5 css3 阴影效果

    阴影效果曾让 Web 设计师既爱又恨,现在,有了 CSS3,你不再需要 Photoshop,已经有网站在使用这个功能了,如 24 Ways website. -webkit-box-shadow: 1 ...

  3. Sencha Touch 实战开发培训 视频教程 第二期 第八节 (完结)

    2014.4.23 晚上8:00左右开课. 本节课耗时超长,因为演示过程中出现了一些小错误,所以耗时接近2小时. 本期培训一共八节,前两节免费,后面的课程需要付费才可以观看. 本节内容: 开发cord ...

  4. Openstack的网卡设置

    本博客已经添加"打赏"功能,"打赏"位置位于右边栏红色框中,感谢您赞助的咖啡. 最开始接触Openstack,这块是比较头疼的,不同的文档,设置都会有所差异,并 ...

  5. linux下抓包学习--tcpdump的使用

    一.为什么需要学这个 很多时候,开发环境上不会出现问题.但在测试或者现场时,总是会有很多莫名其妙的问题. 这时候,能在出问题的环境上,开启抓包,然后再去重现问题的话,这时候,就可以拿到第一手的资料了. ...

  6. hihoCoder挑战赛28 题目3 : 树的方差

    题目3 : 树的方差 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 对于一棵 n 个点的带标号无根树,设 d[i] 为点 i 的度数. 定义一棵树的方差为数组 d[1. ...

  7. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十一:PS/2模块⑤ — 扩展鼠标

    实验十一:PS/2模块⑤ — 扩展鼠标 当普通鼠标即三键鼠标再也无法满足需求的时候,扩展鼠标即滚轮鼠标就诞生了,然而实验十一的实验目的就是实现滚轮鼠标的驱动.不过,进入整体之前,先让我们来了解一下鼠标 ...

  8. C# 未能加载文件或程序集“mysql.data”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

    报错信息: 在web.config中已经加了以下代码. <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-co ...

  9. 关于C#泛型作用的简单说明

    泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. C#泛型的作用概述 C#泛型赋予了代码更强的类型安全,更 ...

  10. [sharepoint]Office Web Apps for SharePoint 2010

    Office Web Apps for SharePoint 2010 2012年09月20日 ⁄ 综合 ⁄ 共 908字 ⁄ 字号 小 中 大 ⁄ 评论关闭 After you install Of ...