C++之decltype和auto的用法

返回值 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;  
}  
```

注:

  1. 使用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 &
  2. auto声明的变量必须初始化(堆上的变量也必须提供初始值)。

         auto b = new auto();//错误
         int *p = new auto();//错误
         auto c = new auto(9);//c的类型为int *
    
  3. 可用*,&,&&修饰auto。

    
    auto * p = auto(3);//auto:int
    
  4. 避免使用旧式auto用法:
    auto int a = 6;//错误

  5. auto不能用作函数参数和模板参数

    int func1(auto a){}//错误
    template<auto T>//错误
    func2(T a){}
  6. 由于auto只是一个占位符,所以不能用于类型转换、sizeof()等操作。

  7. 同一个auto只能推导出同一种类型。
    auto a = 8, b = ‘y’;//错误,因为b和a不能推导成一个类型
  8. auto 会退化成指向数组的指针,除非加上引用。
    int a[3];
    auto b = a;//b的类型为int *
    auto& c = a;//c的类型为 int [3]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值