C++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型。
auto是一个C语言关键字,它和早期C++中的auto关键字一样,它修饰局部变量,表示自动生命周期。
C++98 auto
早在C++98标准中就存在auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命周期。
auto a = 10;//自动生命周期
auto int b = 20;// 自动生命周期
static int c = 30;//延长生命周期
c++98中的auto多余且极少使用,C++11中已经删除这样的用法。
C++11 auto
auto 可以让编译器能够根据初始值推断变量的类型。
int a = 10;
auto b = a;//自动推断类型,b为 int类型
auto c = 1.9;//自动推断类型,c为double类型
auto d = 1.2e12L;//自动推断类型,d 是 long double
auto用法演示:
#include <iostream>
#include <vector>
using namespace std;
#define COUNT 5
int main (int argc, char **argv)
{
vector<int> myvector;
for (int i = 1; i < COUNT; ++i)
{
myvector.push_back(i);//在向量的最后一个元素之后,在其末尾添加一个新元素。
}
for (std::vector<int>::iterator i = myvector.begin(); i != myvector.end(); ++i)
{
cout<<*i <<" ";
}
cout << endl;
return 0;
}
输出结果:
auto版本
#include <iostream>
#include <vector>
using namespace std;
#define COUNT 5
int main (int argc, char **argv)
{
vector<int> myvector;
for (int i = 1; i < COUNT; ++i)
{
myvector.push_back(i);//在向量的最后一个元素之后,在其末尾添加一个新元素。
}
for (auto it = myvector.begin(); it != myvector.end(); ++it)
{
cout<<*it <<" ";
}
cout << endl;
return 0;
}
输出结果:
在for循环中it将在编译时自动推导类型,而不用我们显式去定义那常常的一串(std::vector::iterator)。
类型推导
1.auto变量必须在定义是初始化,这类似于const关键字。
2.定义在一个auto序列的变量必须始终推导成同一类型
例如:
auto a = 10, b = 20 ,c = 30;//正确
auto i = 10, j = 20, k = 'a'; //错误
在使用auto关键字做类型自动推导时,应该准守规则:
如果初始化表达式const或volatile,则除去const/volatile语义。
const int a = 10;
auto b = a; //b的类型为int而不是const int (去除const)
const auto c = a;//此时c的类型为 const int
b = 100;//合法
c = 100;//不合法
如果初始化表达式是引用,则去除引用语义。
int a = 10;
int &b = a;
auto c = b;//c的类型为int而非 int & (去除引用)
auto &d = b;//此时c的类型才为 int &
初始化表达式为数组时,auto关键字推导类型为指针
const int arr[] = {11};
auto p = arr;//arr 是const int *,这是底层const,推导后,保留底层const,所以p是 const int*
注意
函数或者模板参数不能被声明为 auto
void func(auto a) //错误
{
// other
}
时刻要注意auto并不是一个真正的类型。auto仅仅是一个占位符。不能使用sizeof来测试大小。
cout << sizeof(auto) << endl;//错误
总结
合理使用auto,不是很明确的规则,不建议以代码可读性为代价而简化代码。直接写出变量的类型更加清晰易懂。
扫二维码关注微信公众号,获取技术干货