采用何种工具来查看型别推导结果,取决于你在软件开发过程的哪个阶段需要该信息.主要研究三个可能的阶段:撰写代码阶段.编译阶段.运行时阶段. IDE编译器 IDE中的代码编译器通常会在你将鼠标指针选停止某个程序实体,如变量.形参.函数等时,显示出该实体的型别.例如以下这段代码: ; auto x = theAnswer; auto y = &theAnswer; IDE编译器很可能会显示出,x的型别推导结果是int,而y则是const int*. 而让这种方法奏效,代码就多多少少要处于一种可编译状态…
类的代理对象 其实这部分内容主要是说明了在STL或者某些其他代码的容器中,在一些代理类的作用下使得最后的返回值并不是想要的结果. 而他的返回值则是类中的一个容器,看下面的一段代码: std::vector<bool> Boolen(const Sign& w);//返回值为vector<bool>的函数 Signed a; bool b = Boolen(a)[3]://返回值为 vector<bool>& auto c = Boolen(a)[3];/…
在条款1中,我们已经了解了有关模板型别的推导的一切必要知识,那么也就意味着基本上了解了auto型别推导的一切必要知识. 因为,除了一个奇妙的例外情况,auto型别推导就是模板型别推导.尽管和模板型别推导打交道的是模板.函数和形参,auto和它们秋毫无犯,但并不影响上面的结论成立. 在条款1中,我们用来解释模板型别推导的函数模板形如: template<typename T> void f(ParamType param); 而一次调用形如: f(expr); //以某表达式调用f 在f的调用语…
条款2.理解auto型别推导 对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的.只有一种特例情况. 我们先针对auto和模板型别推导一致的情况进行讨论: //某变量采用auto来声明的时候,其中auto就扮演了模板中的T这个角色,而变量的型别修饰词则对应函数形参paramauto x = 27;//其中T对应auto.param也对应autoconst auto cx = x;//T对应auto,param对应const autoconst auto& rx = x; //p…
说起decltype,这是个古灵精怪的东西.对于给定的名字或表达式,decltype能告诉你该名字或表达式的型别.一般来说,它告诉你的结果和你预测的是一样的.不过,偶尔它也会给出某个结果,让你抓耳挠腮,不得不 去参考手册或在线FAQ页面求得一些启发. 先从一般案例讲起——就是那些不会引发意外的案例.与模板和auto的型别推导过程相反,decltype一般只会鹦鹉学舌,返回给定的名字或表达式的确切型别而已: ; //decltype(i)是const int bool f(const Widget…
条款5 对于auto ,他的好处不仅仅是少打一些字这么简单. 首先在声明的时候, 使用auto会让我们养成初始化的习惯: auto x;//编译不通过必须初始化. 再次对于auto而言,它可以让我们定义和声明那些编译器才知道的变量类型,比如说函数闭包类型. //在c++11中 auto dere = [](const std::unique_ptr<Widget>& p1, const std::unique_ptr<Widget>& p2){ return *p1…
杂项 在本条款的开头书中提到了两个细节性问题: 1.类中成员初始化的时候不能使用小括号. 如: class A { int a(0);//错误 }; 2.对于原子性类别的对象初始化的时候不能使用= 如: std::atomic<int> a = 0;//错误 大括号初始化的特性(以下都是使用{}初始化对象时具备的特性): 1.禁止窄式类别转换 double x,y,z; int sum(x+y+z);//错误 double之和可能无法用int 表达 2.能避免令人苦恼的解析语法 C++规定:任…
条款4:了解怎样查看推导出的类型 那些想要了解编译器怎样推导出的类型的人通常分为两个阵营. 第一种阵营是实用主义者.他们的动力通常来自于编敲代码过程中(比如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能帮他们找到问题的根源.另外一种是经验主义者.他们正在探索条款1-3所描写叙述的推导规则. 而且从大量的推导情景中确认他们预測的结果("对于这段代码,我觉得推导出的类型将会是-"),可是有时候.他们仅仅是想简单的回答假设这样,会怎么样呢之类的问题?他们可能想知道假设我用一个un…
成百上千的程序员都在向函数模板传递实参,并拿到了完全满意的结果,而这些程序员中却有很多对这些函数使用的型别是如何被推导出的过程连最模糊的描述都讲不出来. 但是当模板型别推导规则应用于auto语境时,它们不像应用于模板时那样符合直觉.所以了解作为auto基础的模板型别推导的方方面面就变得相当重要了. 本条款将说明这些推导过程.这里通过一段伪代码来说明,函数模板大致形如: template<typename T> void f(ParamType param); 而一次调用形如: f(expr);…
条款4:了解如何观察推导出的类型 那些想要知道编译器推导出的类型的人通常分为两种,第一种是实用主义者,他们的动力通常来自于软件产生的问题(例如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能帮他们找到问题的源头(they’re looking for insights into compilation that can help them identify the source of the problem.).另一种是经验主义者,他们探索条款1-3所描述的推导规则,并且从大量的推导情…