Effective Modern C++ 之 auto和decltype的型别推导

首先我们应该知道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& 型别。
发布了50 篇原创文章 · 获赞 11 · 访问量 4077

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/104054804