1.考虑到auto在c++中使用很少,在c++11中,auto关键字不再表示存储类型指示符(static int 和auto int是相对的 )。而改成了一个类型指示符,用于编译器自动推导变量类型。
2.
2.1auto可以直接推导出指针
2.2可以使用cv限定符(const、volatile)
2.3表达式带有cv限定符时,会丢弃cv限定符。
2.4auto和引用或者指针结合时,将保留cv限定符属性。
const auto e = 0;
auto f = e; // f -> int
const auto & g = e;
auto h = g; // g -> const int&
实际上auto的推导规则类似于函数模板。
3.auto的限制
3.1auto不能用于函数参数。
3.2auto不能用于非静态成员变量。
3.3auto无法定义数组
3.4无法推导模板参数
void fun(auto a = 1){}; //error 不能用于函数参数
class MyClass
{
auto val = 0; // error 不能用于非静态成员变量
static const auto val2 = 0; // ok
};
auto szMy[20]; // error 不能用于数组
template<typename T>
struct Bar{};
Bar<int> bar;
Bar<auto> bar = bar; // error 无法推导出模板参数
4.auto推导数组时,会像函数参数那样退化成指针。
int szMy1[10] = {0};
auto szMy2 = szMy1; // szMy2 -> int*
5.常用位置
5.1代替stl中复杂的迭代器,简化代码
std::map<int,double> mapMy1;
std::map<int,double>::iterator it = mapMy1.begin();
auto my = mapMy1.begin(); // auto替代迭代器
// 写法1,用于删除特定内容
for(auto &my = mapMy1.begin();my != mayMy1.end();)
{
if(...)
{
++ my; // 非标准类型++my优于my++
}
else
{
my = mapMy1.erase(my);
}
}
// 写法2,用于读取所有内容
for(auto &my : mapMy1) // &减少了一次拷贝
{
...
}
5.2 可以简化函数定义
class Foo
{
public:
static int get(void)
{
return 0;
}
};
class Eoo
{
public:
static const char* get(void)
{
return "0";
}
};
template<typename A>
void func(void)
{
auto val = A::get();
}
int main()
{
func<Foo>(); // 推导出val的类型为int
func<Eoo>(); // 推导出val的类型为char*
return;
}