typename std::iterator_traits<It>::value_type currValue = *b;
auto currValue = *b;
int x1; //正确,但是未初始化
auto x2; //错误,没有初始化
auto x3 = 3; //正确,声明并初始化
template<typename It>
void dwim(It b, It e)
{
for(; b!=e; ++b)
{
auto currValue = *b;
...
}
}
auto derefLess = [](const std::unique_ptr<Widget>& p1, const std::unique_ptr<Widget>& p2){ return *p1 < *p2; };
std::function<bool(const std::unique_ptr<Widget>&, const std::unique_ptr<Widget>& )>
derefUPLess = [](
const std::unique_ptr<Widget>& p1, const std::unique_ptr<Widget>& p2){ return *p1 < *p2; };
std::vector<int> v;
...
unsigned sz = v.size();// v.size()返回值类型是 std::vector<int>::size_type, 指定是一种无符号整型类型
auto sz = v.size();
std::unordered_map<std::string, int> m;
...
for(const std::pair<std::string, int>& p : m)
{
... // do somethins with p
}
for( const auto& p : m)
{
... // as before
}
//提取出Widget对象的特征,并以vector<bool>的形式返回
//每一个bool代表该feature是否存在
std::vector<bool> features(const Widget& w);
Widget w;
...
//访问特定的feature标志位5
bool highPriority = features(w)[5];//(1)
auto highPriority_alt = features(w)[5];//(2)
...
//根据上述标志位的值来处理Widget对象
processWidget(w, highPriority);//(3)
processWidget(w, highPriority_alt);//(4)
...
Matrix m1, m2, m3, m4;
...
Matrix sum = m1 + m2 + m3 + m4;
auto highPriority = static_cast<bool>(features(w)[5]);
auto sum = static_cast<Matrix>(m1 + m2 + m3 + m4);
auto自动类型推导可以精简代码,避免隐式转换带来开销,同时增强程序可移植性和减少重构复杂性;但也由于与隐式代理类的冲突,造成了一些潜在问题,但是这些问题不是auto引起的,而是代理类本身的问题,因此显式静态类型转换可以保留auto的优点,同时保证程序的正确性。