本章节主要是针对于如何查看编译或者书写过程中如何查看型别推导的结果进行一个陈述;
作者推荐使用boost库下的typeid来进行查看;
通过本章节发现了自己之前理解条款1,2的一个漏洞;
考虑如下代码:
struct mywidget {};
template<typename T>
void f(const T& param);
vector<mywidget> createVec();
const auto vw = createVec();
f(&vw[0]);
考虑如上定义,vw必定为const vector<mywidget>类型,而T和param的类型是什么?
这里需要进行分析;
对于&vw[0],则是取地址,相当于传入指针:
const vector<mywidget>* vw=createVec();
对于f的形参,const T& param,const修饰的是T,和T&屁关系都没有,&只管心传进来的值是不是const的;
由于vw为const指针,指向的为const对象,因此T&给予保留,T应该为const vector<mywidget>*;
又因为f的形参中的const修饰的是该指针,所以应该是指针为const,且应该为const指针的引用;
因此param的型别:const vector<mywidget>* const &;
因此T的型别为:const vector<mywidget>*;
因此要尤其注意一下条款1的第一种引用情况:
结合param只针对于T&,和修饰T&的const无关,如果普通对象,const可以不重合,但是指针特例,既要注意是内容const还是本身const,还要是至真的要引用;