auto在声明变量的时候可根据变量初始值的数据类型自动为该变量选择与之匹配的数据类型:
double x = 100.00;
auto y = x;//自动类型推断,x为 double 类型,所以此时auto 等价于 double
cout << typeid(y).name() << endl;
其中 typeid 运算符的作用是输出变量的类型。结果输出了 double.
auto的用法
上面举的这个例子很简单,在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。下面列举auto关键字的正确用法。
用于代替冗长复杂、变量使用范围专一的变量声明。
想象一下在没有auto的时候,我们操作标准库时经常需要这样:
#include<string>
#include<vector>
int main()
{
std::vector<std::string> vec;
for (std::vector<std::string>::iterator i = vec.begin(); i != vec.end(); i++)
{
//...
}
}
这样看代码写代码很复杂。有些人会说为什么不直接使用 using namespace std,这样代码可以好看一些。但是实际上这不是该建议的方法(看文章后半部分)。使用auto能简化代码:
#include<string>
#include<vector>
int main()
{
std::vector<std::string> vec;
for (auto i = vec.begin(); i != vec.end(); i++)
{
//...
}
}
for 循环中的变量 i 将在编译时自动推导并匹配其类型,而不用显式去定义那长长的一串。
在定义模板函数时,用于声明依赖模板参数的变量类型。
template <typename _Tx,typename _Ty>
void Multiply(_Tx x, _Ty y)
{
auto v = x*y;
std::cout << v;
}
模板函数依赖于模板参数的返回值
template <typename _Tx, typename _Ty>
auto multiply(_Tx x, _Ty y)->decltype(x*y)
{
return x*y;
}
当模板函数的返回值依赖于模板的参数时,无法在编译代码前确定模板参数的数据类型,故也无从知道返回值的数据类型,于是我们可以使用auto。格式如上所示。
关于为何不直接使用using namespace std的说明
《C++ Primer Plus (第六版 中文版 人民邮电出版社)》第九章:内存模型和名称空间
"有关using编译命令和using声明,需要记住的一点是,他们增加了名称冲突的可能性。"
一般说来,使用 using命令 比使用 using编译命令 更安全,这是由于它只导入了制定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译命令导入所有的名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。
...
然而名称空间的支持者希望有更多的选择,既可以使用解析运算符面也可以使用using声明,也就是说,不要这样做:
using namespace std; // avoid as too indiscriminate(随意)
正确做法
int x;
std::cin >> x ;
std::cout << x << std::endl;
//or
using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;