03尽量使用auto来声明对象而不是显式类型 Scott Meyers的effective modern c++讲座摘要

使用auto来声明对象有五大好处:

1. 强制初始化

int sum;            // 可能造成未初始化的问题
auto sum;         // 不允许,因为无法推导类型
auto sum = 5;  //  必须初始化auto

2. 代码简单,避免语法噪音

std::vector<std::string::iterator> vsi;
...
for(std::string::iterator si: vsi) ...   //  使用显式类型
for( auto si : vsi )    //  使用auto

template<typename It>
void someAlgorithm(It b, It e)
{
  typename std::iterator_traits<It>::value_type firstElem = *b;  // 使用显示类型
  auto firstElem = *b;   // 使用auto
}

3. 避免“类型捷径"(type shortcut)

std::vector<int> v;
...
unsigned sz = v.size()    // type shortcut! 应该是std::vector<int>::size_type
auto sz = v.size();          // sz现在是std::vector<int>::size_type
// unsigned在32位机和64位机上是不一样的,一个32位,一个64位

4. 避免不经意的创建了临时对象

std::map<std::string, int> m;   // 保持的对象类型实际上是 std::pair<const std::string, int>
...
// 下面语句实际上创建了临时对象,因为应该是const string而不是string
for ( const std::pair<std::string, int>& p: m )  

// 下面就没有问题了
for( const auto& p : m )

5. 更高效地存储函数对象

// 下面的语句造成闭包可能是在堆上,因为不知道a, b这两个外部变量是什么类型
std::function<int(int)> fla = [a,b](int x) { return x*x - a/10 + b; }

// 下面的语句导致闭包肯定不在堆上
auto flb =  [a,b](int x) { return x*x - a/10 + b; }
posted @ 2019-03-27 19:47  hanjackcyw  阅读(252)  评论(0编辑  收藏  举报