auto类型详解

下面是auto的使用举例:
auto x =5; //正确,x是int类型
auto pi = new auto(1); //正确,批是int*
const auto* v = &x, u = 6; //正确,v是const int*类型,u是const int
static auto y = 0.0; //正确,y是double类型
auto int r; //错误,auto不再表示存储类型的指示符
auto s; //错误,auto无法推导出s的类型(必须马上初始化)
auto并不能代表一个实际的类型声明(上面s编译错误),只是一个类型声明的“占位符”。使用auto声明的变量必须马上初始化,以让编译器推断出它的类型,并且在编译时将auto占位符替换为真正的类型。
2. auto类型推导规则
int x = 0;
auto *a = &x; //a->int*,auto被推导为int
auto b = &x; //b->int*,auto被推导为int*
auto &c = x; //c->int&,auto被推导为int
auto d = c; //d->int, auto被推导为int

const auto e = x; //e->const int
auto f = e; //f->int

const auto& g = x; //e->const int&
auto& h = g; //g->const int&
auto的推导规则:
(1)当不声明为指针或是引用时,auto的推导结果和初始化表达式抛弃引用和const属性限定符后的类型一致,图上面的d和f
(2)当声明为指针或是引用时,auto的推导结果将保持初始化表达式的const属性
3. auto类型推导的限制
(1)auto不可以用于函数参数
void func(auto a=1){} //错误,不可以用作函数参数
(2)auto不可以用于非静态成员变量
struct Foo
{
auto var1 = 0; //错误,不能用于非静态成员变量
static const auto var2 = 0; //正确,var2->static const int
};
注:auto仅能够用于推导static const的整型或者美剧成员(因为其他静态成员无法在类或是结构体中就地完成初始化,都需要在类的外部进行初始化)。C++11中支持非静态成员变量的就地初始化,但却不支持auto类型的非静态成员变量初始化。
(3)auto类型不能用于定义数组
int a[10] = {...};
auto b[10] = a; //错误,auto类型无法定义数组
(4)auto类型无法导出模板参数
template<typename type> struct Bar
{
...
};
Bar<int> a;
Bar<auto> b = a; //错误,auto无法推导出模板参数
4. auto类型推导的使用场景
(1)需要极大简化书写的时候,例如在定义STL迭代指针的时候
int a[] = {1, 2, 3, 4};
std::vector<int> vec(a, a+4);
std::vector<int>::iterator it = vec.begin();
for(; it != vec.end(); ++it)
{
...
}
在使用auto类型推导之后
int a[] = {1, 2, 3, 4};
std::vector<int> vec(a, a+4);
for(auto it = vec.begin(); it != vec.end(); ++it)
{
...
}
(2)在无法知道变量该定义成何种类型的时候
class A
{
static int func1(void)
{
return 1;
}
};

class Bar
{
double func1(void)
{
return 0.0;
}
};

template<typename type> func3()
{
auto a = type::func1();
...
}

---------------------
作者:m_buddy
来源:CSDN
原文:https://blog.csdn.net/m_buddy/article/details/72828576
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/dagao/p/10519627.html

时间: 2024-11-14 14:05:11

auto类型详解的相关文章

赋值运算符函数的返回值类型详解

在c++赋值运算符函数的学习中,对于返回值类型的问题,一直非常费解,今天彻底总结一些每种不同返回值类型的结果: 1.当返回值为空时: <span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span> 这个时候如果只有一个'='(a = b)运算那就没问题,但是如果存在'='(a = b = c)的链式操作时,编译器就会报错 我们看:a = b = c: 程序会先运行

【DataBase】sqlserver字段类型详解

bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint   整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值时很有用.这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的

c#分部类型详解

一.先看代码来理解 代码一 1 class ClassA 2 { 3 void A(){;} 4 void B(){;} 5 } 代码二 1 partial class ClassA 2 { 3 void A(){;} 4 } 5 partial class ClassA 6 { 7 void B(){;} 8 } 代码一和代码二效果是一样的,引用类的成员完全一样,只是声明不不同而已.主要partial在这里是分部类型的关键词 编译过程图解 二.应用场景 1.嵌套在一个类里面 1 class C

Mingyang.net:hibernate.hbm2ddl.auto配置详解【转】

原文地址:http://www.cnblogs.com/feilong3540717/archive/2011/12/19/2293038.html hibernate.cfg.xml 中hibernate.hbm2ddl.auto配置节点如下: <properties> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.

[转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义IHttpActionResult接口的实现 三.HttpResponseMessage 四.自定义类型 五.总结 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学

JavaScript对象类型详解

JavaScript对象类型详解 JavaScrtip有六种数据类型,一种复杂的数据类型(引用类型),即Object对象类型,还有五种简单的数据类型(原始类型):Number.String.Boolean.Undefined和Null.其中,最核心的类型就是对象类型了.同时要注意,简单类型都是不可变的,而对象类型是可变的. 什么是对象 一个对象是一组简单数据类型(有时是引用数据类型)的无序列表,被存储为一系列的名-值对(name-value pairs).这个列表中的每一项被称为 属性(如果是函

C++ string类型详解

C++ string类型详解 string是非常强大的类型,很好的封装了字符串的操作,有些时候我们可以把string当做字符的容器,string也 支持大多数容器操作,下面就列出string类型所支持的所有操作,本文并不是为了讲解string的用法和应用, 而是希望作为string类型的参考文档,每个函数皆在注释后有详细说明,需要用时查阅即可. 1.构造函数 string();//空串 string(size_type length,char ch);//以length为长度的ch的拷贝(即le

网络互联技术(四)-LSA的第四和第五种类型详解

LSA的第四和第五种类型详解 一.External LSA:第五种LSA 我们前面已经详细介绍了前面三种LSA,今天就接着介绍第四种和第五种LSA.因为理解ASBR Summary LSA--第四种LSA需要涉及External LSA的一些知识,所以我们先介绍第五种LSA,然后再回过头来看第四种LSA. External LSA由ASBR(Autonomous System Border Router,自治系统边界路由器,我们前面说过了OSPF网络就是一个自治系统)产生.它是用来通告OSPF网

Mybatis----传入参数parameterType类型详解

Mybatis----传入参数parameterType类型详解 前言 Mybatis的Mapper文件中的select.insert.update.delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型.本文主要给大家介绍了关于MyBatis传入参数parameterType类型的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1. MyBatis的传入参数parameterType类型分两种 \1. 1. 基本数据类型