Effective Modern C++ 读书笔记之第二章

在 Wed 03 August 2016 发布于 读书笔记 分类

auto关键字

Item5:auto优先于显示类型声明

首先,在C/C++中声明一个变量,如果不进行初始化,其默认值可能会因为其所在的作用域的不同而不同,在使用的时候可能会出现意想不到的错误。而auto类型的变量类型是从初始化进行推导的,所以需要在定义auto变量的时候进行初始化。使用auto变量可以强制对其进行初始化。

int a; //ok
auto x = 10; //ok
auto a; //error: declaration of ‘auto a’ has no initializer

其次,使用auto可以避免冗长的显示类型声明,特别是在操作STL的各种容器及迭代器等, auto能够敲很多冗余的代码逻辑,如:

std::map<std::string, std::map<int, std::vector<std::string> > m;
auto index = m.find("auto") //虽然可使用typedef,但是还是需要敲冗长的代码

以及不合适的显示类型声明导致不必要的隐式转换以及中间值的产生,如:

书中举了一个例子,在unordered_map中键的类型其实是std::pair<const std::string, int>,下面的代码中在遍历的时候需要产生中间变量使得std::pair<const std::string, int>转化为std::pair<std::string, int>,并在每次的循环后删除中间变量。
std::unordered_map<std::string, int > m;
...
for(const std::pair<std::string, int>& p : m)
{
  ...
}

再次,auto还可以推导只有编译器才知道数据类型,如lambda表达式构造的闭包,虽然std::function也可以适配lambda表达式构造的闭包,std::function会在其众多模版中实例其中一个来存储lambda表达式构造的闭包, 且std::function因为实现的不同,以及lambda表达式在构造闭包是捕获变量的多少,可能会在堆上分配空间来进行存储。但是auto变量却不在堆上分配空间,且可以肯定的是std::function分配的空间肯定多于auto分配的空间。介于实现的细节和内部的逻辑调用细节,通过std::function来调用lambda表达式构造的闭包几乎是肯定比通过auto来的慢。

Item6: 注意变量类型的初始化方法