C++之类型推导初识

类型推导 --- C++高效编程

  1. 函数模板的类型推导 ---- 调用时没有指定类型T
    1. 万能引用的作用:使函数模板的参数能够接受左值和右值 ----- 提出的原因
    2. 注意事项:
      1. 必须是函数模板
      2. 必须发生了模板类型推导,没有发生显示调用
      3. 类型参数T必须紧紧跟着&&
      4. 不能加const,否则会失效
    3. 函数模板的形参可能存在三种情况:按值、按引用/指针、万能引用(右值引用)
      1. 按值传递的时候,类型推导会丢失const和volatile属性,同时也会丢失引用的属性;
      2. 按指针传递的时候,不丢弃cv属性
      3. 按左值引用传递的时候,不丢弃cv属性,丢弃引用属性;
      4. 按万能引用传递的时候,不丢弃cv属性,有左值(不为左值引用)即为左值引用(引用折叠)
template <typename T>    // 调用的时候没有指定类型T
void func(T param)       // 按值传递 
void func(T &param)      // 按左值引用
void func(T &&param)     // 按万能引用
        • 引用折叠:
//int &&param   -- int &param
//int &&&param  -- int &param
//int &&&&param -- int &&param
        • 完美转发:发生类型推导的函数模板中调用了另外一个指定参数类型的函数
void test(int &r_lnum)    // 指定了类型只能为左值
{
    cout << r_lnum << endl;
}


template <typename T>
void func(T &&param)
{
    //test(std::forward<int &&>(param)); //forward:可以实现左右相互转换
    test(std::forward<int &>(param));
}
          • std::move( ) ------ 左值转化成右值
          • std::forward< >( ) ------ 可以实现左右值得相互转换
      • 右值引用本身就是一个左值,可以对其进行修改。
  1. auto类型推导
    1. auto指针不会丢弃cv属性
    2. auto引用会丢弃引用属性
    3. auto变量推导一切正确
  2. decltype类型推导 ----- 可以在推导出类型的同时声明变量
    1. decltype变量还是对应类型的变量
    2. decltype指针和引用推导出对应类型的指针和引用
    3. decltype解引用推导出引用
    4. declype表达式,如果表达式左值可以作为左值,则返回左值引用
  3. decltype(auto)用于函数返回值得推导
  4. decltype VS auto

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值