C++11 auto类型推导
1. 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被推导为intconst auto e = x; //e->const int
auto f = e; //f->intconst auto& g = x; //e->const int&
auto& h = g; //g->const int&
auto的推导规则:
(1)当声明为指针或是引用时,auto的推导结果将保持初始化表达式的const属性。(保留const)
(2)当不声明为指针或是引用时,auto的推导结果和初始化表达式抛弃引用和const属性限定符后的类型一致,图上面的d和f。(不保留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();...
}
C++11 auto类型推导相关推荐
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一 ...
- C++11 decltype类型推导详解
decltype decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"declare type" ...
- C++11 auto类型说明符
编程时常常需要将表达式的值赋值给变量,这就要求在声明变量前知道表达式的类型,有时候很难预先知道,所以C++11新标准引入了auto类型说明符,其作用就是让编译器替我们去分析表达式的值类型,,auto让 ...
- [C++11]自动类型推导auto
1.auto C++11中,auto并不代表一种实际的数据类型,只是一个类型声明的"占位符",auto并不是万能的在任意场景下都能够推导出变量的实际类型,使用auto声明的变量必须 ...
- C++11 auto自动推导
文章目录 C++98 auto C++11赋予auto更强大的功能 规则 auto的常见用法 用于代替冗长复杂.变量使用范围专一的变量声明. 在定义模板函数时,用于声明依赖模板参数的变量类型. 模板函 ...
- c++11 auto 类型说明符详解
当使用 auto 自动推断类型时,需要注意以下几点: 一.必须要有初始值 一个显而易见的道理,auto 表示编译器根据初始值类型推断声明变量的类型,因此必须要有初始值. 二.一条声明语句只能有一种基本 ...
- C++11 auto自动类型推导
1. auto类型推导 下面是auto的使用举例: auto x =5; //正确,x是int类型 auto pi = new auto(1); //正确,批是int* const auto* v = ...
- C++11 类型推导decltype
我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通 ...
- 《Effective Modern C++》翻译--条款2: 理解auto自动类型推导
条款2: 理解auto自动类型推导 如果你已经读过条款1关于模板类型推导的内容,那么你几乎已经知道了关于auto类型推导的全部.至于为什么auto类型推导就是模板类型推导只有一个地方感到好奇.那是什么 ...
- C++11新特性之decltype类型推导
目录 一.decltype关键字 二.decltype的推导规则 1.表达式为单独变量 2.表达式为函数调用 3.表达式为左值,或者被()包围 三. decltype的应用 在前面一章,小编已经对 ...
最新文章
- iis8.5部署net项目
- datagrid单选多选
- Linux下的Nano命令
- Scala集合:List修改及删除数据
- “约见”面试官系列之常见面试题之第九十一篇之简述Vue的生命周期适用于哪些场景(建议收藏)
- 【BZOJ2565】最长双回文串(回文树)
- 本地网络适配器里找不到虚拟机VMnet8
- gtx1060+linux+双显卡,ubuntu14.04+GTX1060 重新安装显卡驱动
- java实现汉诺塔游戏(递归)(附超详细易懂注释)
- ISCSLP 2022 | AccentSpeech—从众包数据中学习口音来构建目标说话人的口音语音合成系统
- java tea bag_设计模式系列教程—Template Method Pattern(模板方法模式)
- Leetcode刷题-最长公共前缀
- 你是这样的 CSS,19个唯美的边框
- RISC-V为中国MCU企业打开一个新窗口!
- 【webpack系列】webpack小老弟打包大项目
- php获取QQ音乐直链,微信小程序-获取QQ音乐直链
- vue form表单数据提交与 router 按钮快速调用页面
- 区别:过去完成时、现在完成时、一般过去时
- 十一年架构师教你怎么打造PHP程序员简历
- php对电话号码生成图片,帝国CMS插件之手机号码生成图片格式插件
热门文章
- Go多线程并发避免堵塞
- “日薄西山”的摩托罗拉推出VR头显,这回靠谱吗?
- [译]如何成为一个优秀的前端工程师
- 4.docker 添加国内镜像
- 8.1 Zend_View
- 22.客户端识别与 cookie 机制
- 58. magento quote lifetime
- 3.2 Zend_Db_Select
- 83. 验证码(1)
- 14. Window clearInterval() 方法