auto关键字在c++11之前,表示存储类型指示符,表示具有自动存储期的局部变量。 比如
auto int a = 0; static int j = 0;
以上两者是相对的,一个在出变量作用域就会释放内存,static变量会存放在静态数据区,对于未初始化的会自动初始化未为0,在程序结束后才会释放内存。
在c++11标准中,auto变成了一个类型指示符,用来提示编译器对此类型的变量做自动推导,但是有一些注意的地方需要说明,
- 当变量不为指针或引用时,auto进行推导会抛弃const和volatile属性
- 变量是指针和引用时,auto保留const和volatile属性
例子
auto i = 0;
const auto j = i;
auto k = j;
auto* a = &i;
const auto* c = &i;
在VS上可以将鼠标悬浮在变量名上,查看变量类型。
有四种情形没有办法使用auto,分别是
- auto无法作为函数形参
- 没有办法修饰数组
- 不能用于非静态成员变量
- 无法做模板类型推导
举例
void fun(auto a)
{
return a;
}
struct{
static const auto b = 0;
};
template<typename T>
class bar{};
bar<int> b;
使用auto的好处
使用迭代器不在需要大段的编写类型定义,以下是关于输出map在c++98 11 17 的代码。
std::map<int, std::string> m;
m.insert({ 1, "world" });
for (const auto& [number, name] : m)
{
std::cout << number << "|" << name << std::endl;
}
std::map<int, std::string>::iterator it = m.begin();
for (; it != m.end(); it++)
{
std::cout << it->first << "|" << it->second << std::endl;
}
auto it = m.begin();
for (; it != m.end(); it++)
{
std::cout << it->first << "|" << it->second << std::endl;
}
|