C++11引入了auto和decltype关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。
一、auto
auto可以让编译器在编译器就推导出变量的类型;
auto的基本用法:可以通过等号右边的类型推导出变量的类型;
auto推导注意事项:
- auto的使用必须马上初始化,否则无法推导出类型;
- auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败;
- auto不能用作函数参数;
- 在类中auto不能用作非静态成员变量;
- auto不能定义数组,可以定义指针;
- auto无法推导出模板参数;
- 当变量
不是
指针或者引用类型时,推导的结果中不会保留const
、volatile
关键字 - 当变量
是
指针或者引用类型时,推导的结果中会保留const
、volatile
关键字
二、decltype
在某些情况下,不需要或者不能定义变量,但是希望得到某种类型,这时候就可以使用decltype
关键字,它的作用是在编译器编译的时候推导出一个表达式的类型;decltype
的推导是在编译期完成的,它只是用于表达式类型的推导,并不会计算表达式的值。
decltype推导规则:
对于decltype(exp):
- exp是表达式,decltype(exp)和exp类型相同
- exp是函数调用,decltype(exp)和函数返回值类型相同
- 其它情况,若exp是左值,decltype(exp)是exp类型的左值引用
int a = 0, b = 0;
decltype(a + b) c = 0; // c是int,因为(a+b)返回一个右值
decltype(a += b) d = c; // d是int&,因为(a+=b)返回一个左值
三、auto和decltype结合使用
返回类型后置的配合使用:返回值后置类型语法就是为了解决函数返回制类型依赖于参数但却难以确定返回值类型的问题。
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
return t + u;
}