auto关键字笔记
在力扣的题解中看到auto关键字,之前并没有接触过,了解了一下并把可能会经常用的用法记了个笔记
原文在这里
用法:
- 在变量声明时根据初始化表达式自动推断该类型的类型
- 声明函数时作为函数的返回值的占位符
简单的例子
#include<iostream>
#include<vector>
using namespace std;
template<class T, class U>void add(T t, U u){
auto s = t + u;
cout << "Type of t + u is" << typeid(s).name() << endl;
}
int main(){
auto a = 123;
cout << "Type of a is" << typeid(a).name() << endl;
auto s("fred");
cout << "Type of s is" << typeid(s).name() << endl;
vector<int> vec;
auto iter = vec.begin();
cout << "Type of iter is" << typeid(iter).name() << endl;
add(101, 1.1);
}
注意事项:
-
使用auto关键字的变量必须有初始值
-
可以使用valatile, *(指针类型说明符), &(引用类型说明符), &&(右值引用)来修饰auto关键字
auto a = 10; auto *pa = new auto(a); auto **rpa = new auto(&a); cout << typeid(a).name() << endl; cout << typeid(pa).name() << endl; cout << typeid(rpa).name() << endl;
-
函数参数和模板参数不能被声明为auto
-
使用auto关键字进行声明变量的类型,不能自动推导出顶层的CV-qualifiers和引用类型,除非显式声明
#include<iostream> #include<typeinfo> using namespace std; int main(){ int i = 10; int &r = i; auto a = r; a = 13; cout << "i = " << i << "a =" << a << endl; auto &b = r; b = 15; cout << "i = " << i << "b =" << b << endl; }
-
使用auto使用auto关键字进行类型推导时,编译器会自动忽略顶层const,除非显示声明
#include<iostream> #include<typeinfo> using namespace std; int main(){ const int c1 = 10; auto c2 = c1; // c1 = 11; c2 = 14; cout << c1 << endl; // 报错,c1为const int类型,无法修改const变量 cout << c2 << endl; // 正确,c2为int类型 // 显示声明 const auto c3 = c1; c3 = 15;// 报错,c3为const int类型,无法修改const变量 }
-
对于数组类型,auto关键字会推导为指针类型,除非被声明为引用
int a[10]; auto b = a; cout << typeid(b).name() << endl; // 输出:int * auto &c = a; cout << typeid(c).name() << endl; // 输出:int [10]