作者是一个新手,文章中的内容大部分来自于其他博文,作者仅仅是加入了少量自己的理解,方便自己在遗忘时查看,并且作者会在文章末尾附上原文链接,方便各位网友前往学习
在C中,使用auto修饰的变量,是具有自动储存器的局部变量,但是很少有人去使用它,在C++11中,auto有了新的含义,他不再是是个储存类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得.
#include
using namespace std;
double ReturnDouble() {
return 3.14;
}
int main() {
int a = 10;
auto b = a;
auto c = 'a';
auto d = ReturnDouble();
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
return 0;
}
注意:auto是一个占位符,编译器会根据初始化来推演出类型,填充位置,所以auto必须初始化
比如:
auto a;//不行,不知道a是什么类型
auto b=10;//可以,根据10推测出是int类型
C++中auto类似于C#中的var;
使用auto来声明指针的时候,使用auto和auto没有区别
使用auto来声明引用类型的时候必须加"&"
#include
using namespace std;
double ReturnDouble() {
return 3.14;
}
int main() {
int a = 10;
auto ra1 = a;
auto& ra2 = a;
cout << &a << endl;
cout << &ra1 << endl;//ra1仅仅是简单的赋值;
cout << &ra2 << endl;//ra2引用了a,和a等价,且使用同一个内存空间;
return 0;
}
当同一行声明多个变量时,类型必须相同,否则会报错
auto a=1,b=10;//可行
auto b=10,c='a';//报错
详细理解auto的推演:
const auto *v=&x,u=6;
执行成功,v是"const int*"类型,而u是"const int"类型.
v和u在同一行声明,为什么可以是不同的类型呢?
原因如下:
在"const auto*v=&x"的时候,编译器确定了auto的类型为int,所以到了u的时候,就是"const int"而不是"const int*".即auto推测的不是变量的数据类型,而是变量中auto作为占位符应该替换的类型.
注意事项:
由上面的例子可以看出来,auto不能代表一个实际的类型声明,只是一个类型声明在编写代码阶段的"占位符",在使用auto变量时必须立刻初始化,让编译器立刻推断出他的实际类型,并在编译阶段将auto占位符替换为真正的类型.
auto不能作为函数的参数
void func(auto a = 1) {} // error: auto不能用于函数参数
struct Foo
{
auto var1_ = 0; // error: auto不能用于非静态成员变量
static const auto var2_ = 0; // OK: var2_ -> static const int
};
template
struct Bar {};
int main(void)
{
int arr[10] = {0};
auto aa = arr; // OK: aa -> int *
auto rr[10] = arr; // error: auto无法定义数组
Bar bar;
Bar bb = bar; // error: auto无法推导出模板参数
return 0;
}
#include
using namespace std;
int main() {
int array[] = { 1,2,3,4,5,6 };
for (auto i:array)
{
cout << i << " ";
}
return 0;
}
注意事项:
auto除了可以和指针,引用一起用,还可以和cv限定符(cv-qualifier,const和volatile限定符的统称)一起使用.
举例如下:
int x = 0;
auto * a = &x; // a -> int*,auto被推导为int
auto b = &x; // b -> int*,auto被推导为int*
auto & c = x; // c -> int&,auto被推导为int
auto d = c; // d -> int ,auto被推导为int
const auto e = x; // e -> const int
auto f = e; // f -> int
const auto& g = x; // e -> const int&
auto& h = g; // f -> const int&
上面的例子告诉我们:
那么总结如下:
迭代器变量的定义过程过于繁琐,可以通过auto来简化
原来:std::map
现在:auto it = resultMap.begin();
在unordered_multimap中查找一个范围
原来:std::pair< std::unordered_multimap
现在:auto range = map.equal_range(key);
当我们不知道变量应该被定义成什么类型时
参考文章:
C++ auto(类型推导)精讲 (biancheng.net)
auto关键字_心文花雨的博客-CSDN博客_auto关键字