一 auto含义新变化
C++11中,auto不再是一个存储类型指示符,而是作为一个新的类型指示符。
二 cv属性
volatile和const代表了变量的两种不同的属性:易失的和常量的,在C++标准中,他们常被叫做cv限制符,C++11规定auto可以与cv限制符一起使用,不过申明为auto的变量并不能从其初始化表达式中“带走”cv限制符。auto 和 auto * 没有区别,如果要使得auto申明的变量是另一个变量的引用,则必须使用auto &(会带走cv限制符)
三 auto使用场景
目前常用的几个场景如下:
1、容器的iterator
std::vector<std::string> vs;
for (auto i = vs.begin(); i != vs.end(); i++)
{
//dosth
}
2 模板函数
template <typename T1,typename T2>
void Multiply(T1 a,T2 b)
{
auto c = a + b;
std::cout << c;
}
// 返回值
template<class T, class U>
auto add(T t, U u) { return t + u; }
// 完美转发
template<class F, class... Args>
decltype(auto) PerfectForward(F fun, Args&&... args)
{
return fun(std::forward<Args>(args)...);
}
3 std::bind返回值
……
auto f = std::bind(fn, _1, _2);
……
4 lambda表达式
auto lambda = [](int x) { return x + 3; };
四 简单举例
(并不是auto的常见用法,用于比较auto和auto&的差异)
int a1 = 1;
int& a2 = a1;
const int c_a3 = 10;
int a4[4];
auto d1 = a1;
auto d2 = a2;
auto d3 = c_a3;
auto d4 = a4;
cout << "typeid(d1).name: " << typeid(d1).name() << endl;
cout << "typeid(d2).name: " << typeid(d2).name() << endl;
cout << "typeid(d3).name: " << typeid(d3).name() << endl;
cout << "typeid(d4).name: " << typeid(d4).name() << endl;
d1 = 2;
cout << "a1: " << a1 << endl;
d2 = 3;
cout << "a1: " << a1 << endl;
d3 = 11;
cout << "c_a3: " << c_a3 << endl;
auto& d5 = a1;
auto& d6 = a2;
auto& d7 = c_a3;
auto& d8 = a4;
cout << "typeid(d8).name: " << typeid(d8).name() << endl;
d5 = 4;
cout << "a1: " << a1 << endl;
d6 = 5;
cout << "a1: " << a1 << endl;
//d7 = 12;
//cout << "c_a3: " << c_a3 << endl;
结果如下:
特别是auto关于顶层和底层const, auto会忽略顶层const.
const int* const p = &c_a3;
auto p1 = p; // p1 为const int*
auto& p2 = p; // p2 为const int* const&
五 参考