原创文章,未经许可,禁止转载!

第一章 类型推导

C++98 只有一套类型推导规则,这套规则用于函数模版类型的推导。例如:

template <typename T>
void Print(T v) {
  std::cout << v;
}

Print(1);  // T 推导成 int
Print(1.0f);  // T 推导成 float

C++11 修改了一些规则,并且增加了两套新规则,一套用于 auto 的推导, 一套用于 decltype 的推导。然后,C++14 又扩展了 auto 和 decltype 的用法。类型推导的广泛应用使得编程人员不需要在拼命敲打各种类型的单词,并且增加了 C++ 程序的适应性,只要在源代码的一个地方修改,类型推导就可以自动传播到代码的其他相关部分。然后,这样的写法会让代码更加难以理解,毕竟编译器的类型推导可能与你想象的情况不太一样。

如果对类型推导的理解不够深刻,那么想有效的使用现代 C++ 编程几乎是不可能的。在类型推导过程中,有太多种情况需要考虑到,比如,在调用一个模版函数时,大多数情况下会使用的 auto 。再比如从 C++14 开始,使用 decltype(auto) 表达式来构造对象。(注:auto 和 decltype 经常会让开发者或者看代码的人无法理解或者错误理解对象的类型)。

本章将提供关于所有 C++ 开发者需要的关于类型推导方面的信息,这些信息解释了如何去推导模版类型,以及 auto 是怎样在这个规则下运作的,还有就是 decltype 的推导方式。这里,还会教你让编译器强制输出类型推导的结果,让开发者确认是否是自己想要的结果。

发表评论