auto 和 template 的区别

  1. 说明

    • auto是基于template的规则实现的.

    • 但是有一些细微的差异.auto支持{....}类型,但不支持匹配结果T.

    • auto必须初始化.

  2. 对应关系

    • 说明

      • valutype对应赋值的类型.
      • argtype对应声明的变量类型.
      • auto对应T
    • 差异

      • template不支持{...}类型.但是auto支持.
    • valuetype

      • 是赋值的类型,有默认类型,有函数返回值类型.
      • 一般是函数返回值类型.
    • argtype

      • 则是在valuetype的基础上增加相应的修饰.
    • auto

      • 关键字.
    • template计算关系仍然适用

      • &,&&,*完整的类型.
      • &&万能引用,推导完整类型.
      • T基本类型.值传递.
      • 数组和函数同样.
  3. 案例分析

    • 差异案例一

      template<typename T>
      void show(T a) {
                
                
         // error code
      }
      int main() {
                
                
         show({
                
                1,2,3});
      }
      
      • 编译报错
      • template不支持两次推导.
    • auto两次推导

      #include <initializer_list>
      int main() {
                
                
         auto a = {
                
                1,2,3};
      }
      
      • 第一次推导是编译器将{}推导成initializer_list<T>.
      • 然后是initializer_list<T>T的推导.即valutype - argtype - const,volatile,xxx.
    • 类型推测二义性

      • 即推导出来的T不唯一.
      • {1,2,3.0},推导出来的类型就不唯一.
  4. 如何让模板兼容

    • 兼容案例

      #include <initializer_list>
      template<typename T>
      void show(std::initializer_list<T> a) {
                
                
      }
      int main() {
                
                
         show({
                
                1,2,3});
      }
      
    • 不兼容

      #include <initializer_list>
      template<typename T>
      void show(std::initializer_list<T> a) {
                
                
      }
      int main() {
                
                
         show({
                
                1,2,3.0});
      }
      
      • 因为值的类型不统一,有个浮点,产生了二义性。
  5. 核心

    • 规则

      • template一毛一样.
    • 差异

      • {...}识别.
    • 差异原因

      • 编译器这么写的.
      • 不识别比识别的可用度更广.
      • 比如初始化某个函数的类而不需要声明类型.未来程序的扩展性.
  6. C++14

    • 说明

      • auto关于C++11的故事已经结束.
      • 但是关于C++14的故事还在继续.
      • 下面介绍的内容都是关于c++14的.
    • 函数返回值类型推测

      • 使用template的规则,即不识别{...}.
    • C++14 lambda

      • 入参里面定义lambda,使用template的规则.
      • 在真正使用的时候才编译对应实例,即lambda模板.

猜你喜欢

转载自blog.csdn.net/rubikchen/article/details/121599632
今日推荐