首先我们应该知道auto型别推导的实质就是模板类型推导,在型别推导过程中,把auto替换成T就可以(可以看看我之前写的模板类型推导)。是不是所有的auto都可以与模板的类型推导建立一一映射关系呢?当然不是啦!!auto型别推导中有一条特殊的推导规则。接下来就让我们我们讲一讲啦~~
- 当用auto声明变量,并且该变量用大括号进行初始化时,其推导所得的型别是std::initializer_list<T>。比如:
auto x = { 1 };
std::cout << typeid(x).name() << std::endl; //class std::initializer_list<int>
auto y = { "Jay" };
std::cout << typeid(y).name() << std::endl; //class std::initializer_list<char const *>
所以啦~~,auto和模板型别推导的唯一区别是:auto会假定用大括号初始化表达式代表std::initializer_list<T>。
- 还有一个重点:在函数返回值或lambda式的形参中使用auto,其实质是进行模板型别推导。
有时候我们想告知用户我们推导的型别,该怎么办呢? 可以使用decltype啊~~
- 首先,对于给定的名字或表达式,decltype能告诉你该名字或表达式的型别。我们都知道operator[] 的返回型别是T&,但是我们利用auto进程型别推导时,会忽略掉其引用性,那怎么办呢?可以使用decltype(auto)来解决这个问题的。auto可以告知欲实施推导的型别,而推导过程中采用decltype的规则。
- decltype对对象名字的推导得出的是该名字的声明型别,但是如果使用()便得到的是T& 型别。
Cry . 发布了49 篇原创文章 · 获赞 11 · 访问量 4021 私信 关注