Aquacolor

Aquacolor



新坑【3】

Gumdrop · 2025-08-24 · 22浏览 · 未分类


  1. 完美转发 完美转发真正使用时,通常具有“完美转发参数到另一函数调用参数”的形式,或者类似形式。

    template<typename Arg>
    ... func(Args&& arg){
       ...
       func2(std::forward<Arg>(arg));
       ...
    }
    

    相比直接传递更安全些,但是功能基本与std::static_cast<T&&>()在模板中使用时一致。

    1. 当实际调用参数是右值时,如果直接传递参数将会报错。

    2. 由于含有模板元编程,使用时一定要显式模板参数,

      template<typename T>
      T&& func(T&& a){
          return a;//a是T类型,不能赋值给右值返回值T&&
          return std::forward(a);//不能正确推断
          return std::forward<T>(a);//(o゜▽゜)o☆[BINGO!]
      }
      

    原理利用了模板元编程,但是解决的问题似乎和利用了模板参数包的函数模板有关。 (还是没搞醒所以先跳了,模板元编程大概率也学不会)

  2. 零初始化 零初始化是为了解决内置类型和自定义类型在初始化时的不同表现,即内置类型存在仅声明。

    MyClass myClass;//此后myClass可以使用。
    int i;//若使用了i将会造成未初始化错误。
    MyClass myClass();MyClass myClass = MyClass();//自定义类型有两种初始化方式。
    int i = int();//内置类型只有一种。
    
    template<typename T>
    ...{
        T x = T();//函数模板定义变量的零初始化写法。
    }
    
    template<typename T>
    class MyClass{
        T x;
        MyClass():x(){...};//确保所有成员变量都有初值。
    };
    

    零初始化特性在后面提到初始化列表时有更多内容。

  3. 字符串转换 也称作array-to-pointer或decay,非引用类型自动推断会将字符串降至常指针,包括auto和实参演绎。(是好早的特性了) 字符数组char const[N]和字符串指针const char*并不是一样的。 (实际上在模板编程中出现char[N]char*也是可能的,因为基本类型可以赋值给其常量类型,这太糊了) (typeid().name()不能显示引用类型,所以不考虑引用了;从这里也可以看出引用类型在编译器眼里都是没有引用的)

    (T const& a)//调用参数
    //实际调用
    ("apple")/*和*/char[6] s = "apple";(s);//T推断为char[6]类型,a为char const[6]类型
    const char* s = "apple";(s);//T推断为char const*,a为char const* const类型
    
    (T& a)//调用参数
    //实际调用
    ("apple")//T为char const[6],a也是
    char[6] s = "apple";(s);//T推断为char[6]类型,a也是!!!
    const char* s = "apple";(s);//T推断为const char*,a也是
    
    (T a)//调用参数
    //实际调用
    ("apple")/*和*/const char* s = "apple";(s);//T推断为char const*,a也是
    char[6] s = "apple";(s);//T推断为char*类型,a也是!!!
    

    (明显可以看出char[N]定义的字符串表现十分特殊。所以需要用到它的时候不如用std::string了) 当需要定义这种情况的函数模板时,请进行必要的重载。

    template<typename T>
    ...(T const& a){...}//主模板
    
    template<typename T>
    ...(T* const& a){...}//重载1
    
    ...(char const* const& a){...}//重载2
    
  4. 基本模板 这个术语是用来区分特化与否的。基本模板指未特化的模板,前文有部分“主模板”也是基本模板。

    template<typename t>
    class MyClass{
      ...  
    };//基本模板
    
    template<typename t>
    class MyClass<...>{
      ...  
    };//非基本模板
    
  5. 指针实参 (有点多而且解释不了)

    <int,33>
    <int*,&a>
    <void(*)(int),&f>
    <bool*,&X::b>
    <int X::*,&X::n>
    <void(),&tfunc<>>
    ...
    

    字符串常指针自然能作模板实参,但是字符串通常要声明为外部变量。

  6. 模板其他简单小知识

    1. 类模板成员函数访问类模板私有成员最好显式作用域限定或使用this指针,否则名称将优先查找外部定义。

    2. typedef、using命名的类型,不会对实参演绎造成影响,编译器会把它们转换为原本的类型。



©

comment 评论区

添加新评论

face表情



  • ©2026 bilibili.com

textsms
内容不能为空
昵称不能为空
email
邮件地址格式错误
web
beach_access
验证码不能为空
keyboard发表评论


star_outline 咱快来抢个沙发吧!




©2026 Aquacolor

Theme Romanticism2.2 by Akashi
Powered by Typecho