auto关键字
用法
auto variable initializer
auto function -> return type
只要初始化器的类型被确定,则编译器会用来自函数调用的模板实参推导规则所决定的类型替换关键词
在使用尾随返回类型语法的函数声明中,关键词 auto 不进行自动类型检测。它只作为语法的一部分起作用。
template <typename T1, typename T2>
auto func(T1 a, T2 b) -> decltype(a*b)
{
return a*b;
}
int main()
{
int a = 2;
auto b = a; // 变量的自动类型推导
std::cout << func(2, 'a') << std::endl; // 返回值占位符
return 0;
}
auto 的自动类型推导发生在编译期间,不会降低程序的运行效率。
替代冗长的变量声明
比如,以前对一个list遍历,需要声明迭代器 st::list<int>::iterator iter; 有了 auto 之后,可以直接写 auto iter;
for (std::list<std::string>::iterator iter = strlist.begin(); iter != strlist.end(); ++iter)
{
//...
}
for (auto iter = strlist.begin(); iter != strlist.end(); ++iter)
{
//...
}
这应该是最常用的场景了
注意事项
auto 变量必须初始化。不然无法推导类型。
定义在一个auto序列的变量必须始终推导成同一类型
auto a = 3, b = 4;
auto m = 'a', n = 1; // error
如果初始化表达式是引用,则去除引用语义。
int a = 2;
int &b = a;
auto c = b; // c 的类型是 int
c = 8;
std::cout << a << std::endl; // 2
auto &d = b; // d 的类型是 int&
d = 6;
std::cout << a << std::endl; // 6
如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义
const int a = 2;
auto b = a; // b 的类型为int
b = 23;
const auto c = a; // c 的类型为 const int
c = 12; // error
如果auto关键字带上&号,则不去除const语意
const int a = 2;
auto & b = a; // b 的类型为int
b = 23; // error
如果 b 不是const 类型的话,a 的值可以通过 b 来修改,这不合理
初始化表达式为数组时,auto关键字推导类型为指针
int a[2];
auto b = a; // b 的类型为 int*
若表达式为数组且auto带上&,则推导类型为数组类型
int a[2];
auto & b = a; // b 的类型为 int[2]
函数或者模板参数不能被声明为auto
auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid