C++读书笔记

超精简Effective Modern C++ 第一章 类型推导

条款1.模板类型推导

  1. 引用或者指针,但不是万能引用 template<class T> class Test; T类型被直接推导,const、指针属性保留,引用忽略。
  2. 万能引用 如果传入的是左值,则被推导为左值。 如果传入的是右值,则被推导为右值。
  3. 值类型 值类型全部编程T本身,也就是做成一个复制,会忽略所有的const以及volatile。

数组与函数实参的退化情况

数组和函数都会在模板中退化成指针。

但是通过传入引用的方式可以保留数组。

我们可以利用这种方式实现获取数组长度的模板。

template<typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept
{
	return N;
}

// 使用方法
int keyVal = {1, 3, 7, 9, 11, 22, 35};
int mapedVal[arraySize(keyVal)];

条款2.Auto类型推导

同模板类型推导,但是在变量初始化时如果使用大括号会导致意料外的情况。

// a会被推到位初始化表(std::initializer_list),而不是int
auto a = {1};
auto a{1};

// a会正常赋值为int
int a = {1};
int a{1};

需要注意的是lambda与函数返回值的auto使用的是模板推导而不是变量推导。

条款3.decltype类型推导

delctype会保留所有的原来的类型。

对于类型为T的表达式,除非只有名字,其他表达式全部返回为T&

返回值推导中使用decltype(auto)实际上是使用decltype的方式来推导auto返回值。

条款4.查看类型推导的结果

  • 可以利用IDE
  • 自己写一个模板,利用报错信息显示 template<class T> class TD; 因为没有实现,所以在尝试实例化的时候就会报错 TD<decltype<x>> xType;//报错然后显示类型信息
  • 使用type_id.name() 不同的平台有不同的实现,而且很多时候并不准确
  • 可以用boost提供的库type_index

我们在实际使用当中依旧要记得推导规则。这些方法都只是辅助。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注