使用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; }