返回值 decltype ( 表达式 )
1、当表达式返回右值,则decltype返回该表达式的类型;
2、当表达式返回左值,则decltype返回该表达式的左值引用类型;
注:
- decltype()不会执行表达式,而只是推出表达式的类型。
- 当表达式是函数调用时,返回函数的返回值类型。
- 当表达式是函数名时,返回的是函数类型,而并非函数指针类型。
- 当表达式是数组名时,返回的是数组类型,而不是指针类型
auto的用法:
1、 自动类型推断
- 当变量类型名很长时使用auto;
- 自动推导类型用auto;
- 当变量类型不确定时用auto。比如:
template<class T,class U>
void myFunc(T t,U u)
{
auto m = t + u;
...
}
2、返回值占位。(函数模板中,与decltype结合表示函数返回的类型。)
```
template <typename T1, typename T2>
auto compose(T1 t1, T2 t2)->decltype(t1 + t2)
{
return t1+t2;
}
```
注:
使用auto时,当传递的是const变量的时候,必须手动加上const,因为auto不会自动推倒成const,除非和引用连用。
const int a = 1; const auto b = a;//b的类型为const int auto c = a;//c的类型为int auto& d = a;//d的类型为const int &
auto声明的变量必须初始化(堆上的变量也必须提供初始值)。
auto b = new auto();//错误 int *p = new auto();//错误 auto c = new auto(9);//c的类型为int *
可用
*
,&
,&&
修饰auto。auto * p = auto(3);//auto:int
避免使用旧式auto用法:
auto int a = 6;//错误
auto不能用作函数参数和模板参数
int func1(auto a){}//错误 template<auto T>//错误 func2(T a){}
由于auto只是一个占位符,所以不能用于类型转换、sizeof()等操作。
- 同一个auto只能推导出同一种类型。
auto a = 8, b = ‘y’;//错误,因为b和a不能推导成一个类型 - auto 会退化成指向数组的指针,除非加上引用。
int a[3];
auto b = a;//b的类型为int *
auto& c = a;//c的类型为 int [3]