auto类型-现代C++新特性
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++新特性的更多相关文章
- php函数名后冒号+数据类型(返回值类型限制/php新特性)
		
在PHP7,一个新的功能,返回类型声明已被引入.返回类型声明指定的一个函数返回值的类型. int float bool string interfaces array callable 对象实例 如下 ...
 - H5 和 CSS3 新特性
		
博客地址:https://ainyi.com/52 H5 新特性 语义化标签:header.footer.section.nav.aside.article 增强型表单:input 的多个 type ...
 - HTML5和CSS3新特性一览
		
HTML5 1.HTML5 新元素 HTML5提供了新的元素来创建更好的页面结构: 标签 描述 <article> 定义页面独立的内容区域. <aside> 定义页面的侧边栏内 ...
 - HTML5的新特性
		
HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer. ...
 - HTML5的十大新特性
		
为了更好地处理今天的互联网应用,HTML5添加了很多新元素及功能,比如: 图形的绘制,多媒体内容,更好的页面结构,更好的形式 处理,和几个api拖放元素,定位,包括网页 应用程序缓存,存储,网络工作者 ...
 - HTML5的几大新特性
		
为了更好地处理今天的互联网应用,HTML5添加了很多新元素及功能,比如: 图形的绘制,多媒体内容,更好的页面结构,更好的形式 处理,和几个api拖放元素,定位,包括网页 应用程序缓存,存储,网络工作者 ...
 - html5 新增元素以及css3新特性
		
HTML5 1.HTML5 新元素 HTML5提供了新的元素来创建更好的页面结构: 标签 描述 <article> 定义页面独立的内容区域. <aside> 定义页面的侧边栏内 ...
 - C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
		
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
 - 【C++11】新特性——auto的使用
		
[C++11]新特性——auto的使用 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后 ...
 
随机推荐
- HTML5实现图片预览功能
			
两种方式实现 URL FileReader Index.jsp文件 <%@page contentType="text/html" pageEncoding="UT ...
 - RH318之域控服务器
			
Windows2012域控服务器 一.安装域服务及DNS 1.配置静态IP 2.点击左下角 3.进入--->服务器管理器 4.点击角色和功能 勾选Active Directory域服务与DNS服 ...
 - VIM 如何使用系统的剪切板
			
想要将系统剪贴板里的内容复制到 vi 编辑的文档中怎么办? 例如,在网页上复制了一段文字,想贴到本地的某个文件中. 使用 vi 打开本地文件,在 输入 模式下,按 Shift + Insert 详细可 ...
 - jQuery事件处理(六)
			
1.通过一步步调试的的方法观察了一下存放到cache中的事件及其处理程序的数据格式: { events : { // 根据事件类型存放添加到该元素上的所有事件,下面以click为例 click : [ ...
 - 配置Mac漂亮的Shell--Iterm2+OhMyZSH+Agnoster
			
安装包管理器 首先当然是解决包管理的问题,Mac下面是Homebrew的天下了 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserco ...
 - 2015.7.10js-07(简单时间)
			
今天学习了一个小程序,将本地时间显示在页面上,用了图片的形式. 1.执行原理是,先用6张全0的图片,然后通过循环img各自根据时间来更换相对应的时间图片. 2.使用Date()函数获取本地时间,然后转 ...
 - 23种设计模式之责任链模式(Chain of Responsibility)
			
责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受, ...
 - 分布式搜索elasticsearch几个概念解析
			
原文链接:http://blog.csdn.net/july_2/article/details/24367177 介绍下es的几个概念:cluster 代表一个集群,集群中有多个节点,其中有 ...
 - CENTOS安装ElasticSearch
			
原文链接:https://my.oschina.net/topeagle/blog/591451?fromerr=mzOr2qzZ CENTOS安装ElasticSearch ElasticSearc ...
 - 【CF802C】Heidi and Library (hard) 费用流
			
[CF802C]Heidi and Library (hard) 题意:有n个人依次来借书,第i人来的时候要求书店里必须有种类为ai的书,种类为i的书要花费ci块钱购入.而书店的容量只有k,多余的书只 ...