1.1.1 auto类型推导
作用:编译期时通过表达式确定待定义的变量类型。
示例:
auto x = 5;
auto pi = new auto(1); //pi 被推导为int*
const auto v = &x , u = 6; //v是const int* , u是const int
static auto y = 0.0; //y 是 double
特性:
- auto后的变量必须为同种类型,不能有二义性。
- 就算之前的变量有推导,之后的变量也必须推导或者赋值。
- 即使auto不声明为指针,也会自动推导出指针类型。
- 当表达式为引用类型时,会推导出原始类型。
- 当表达式带有const时,会转换为non-const。
- auto不能用于函数参数、非静态成员变量。
- auto无法定义数组。
- auto无法推导出模板参数。
适用场景:
- a冗长的STL迭代器定义。
- 泛型编程。
1.1.2 decltype关键字
作用:编译期时推导出一个表达式的类型。
示例:
int x = 0 ;
decltype(x) y = 1; //y -> int;
decltype(x + y) z = 0 ; //z -> int;
const int& i = x;
declytype(i) j = y; //j -> const int &
const decltype(z) * p = &z; //p -> const int *
decltype(z) * pi = &z; //pi -> int *
decltype(pi)* pp = & pi; //pp -> int * *
特性:
- 可以保留表达式的引用和const限定。
- 当表达式时指针的时候可以推导出实际类型。
推导规则:
- exp是标识符、类访问表达式时,decltype(exp) 和 exp的类型一致。
- exp是函数调用,decltype(exp) 和返回值的类型一致。
- exp是一个左值,则decltype(exp)是exp类型的左值引用。
推导规则3示例:
int n = 0 , m = 0 ;
decltype(n + m) c = 0; //c -> int
decltype(n += m) d = x; //c -> int&
适用场景:
- 泛型编程。
- 通过变量表达式抽取变量类型。
1.1.3 返回类型后置语法——auto和decltype的结合使用
作用:泛型编程中通过参数的运算来得到返回值的类型。
原始的加法函数:
template <typename R, typename T, typename U>
R add(T t, U u)
{
return t+u;
}
int a=1;
float b=2.0;
auto c = add<decltype(a + b)>(a, b);
这样使用相当不方便,因为外部不知道参数之间应该如何运算,只有函数内部才知道返回值应该用什么表达式进行推导。
所以应当在函数内部定义通过decltype拿到返回值。
使用返回类型后置语法的加法函数:
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
return t + u;
}