美文网首页C++精进之路
C++模板型别推导规则

C++模板型别推导规则

作者: this_is_for_u | 来源:发表于2020-03-01 12:30 被阅读0次

    模板型别推导规则

    以如下形式举例

    template<typename T>
    void f(ParamType param);
    
    f(expr);
    

    共分三种情况:

    • ParamType是指针或者引用但不是万能引用
    template<typename T>
    void f(T& param);
    
    int x = 1; // x类型int
    const int cx = x; // cx类型const int
    const int &rx = x; // rx类型const int&
    
    f(x); // T的类型是int, param类型是int&
    f(cx); // T的类型是const int,param类型是const int&
    f(rx); // T的类型是const int,param类型是const int&
    //当ParamType是指针或引用时,引用特性在推导过程中是被忽略的。
    
    template<typename T>
    void f(const T& param);
    int x = 1;
    const int cx = x;
    const int &rx = x;
    
    f(x); // T的类型是int, param类型是const int&
    f(cx); // T的类型是int,param类型是const int&
    f(rx); // T的类型是int,param类型是const int&
    //当ParamType是指针或引用时,引用特性在推导过程中是被忽略的。
    // 同理,由于param已经具有const特性,所以在推导过程中const属性也会被忽略。
    
    template<typename T>
    void f(T* param);
    int x = 1;
    const int *px = &x;
    f(&x); // T的类型int, param类型int*
    f(px);  // T的类型是const int , param类型const int*
    
    • ParamType是万能引用类型
    template<typename T>
    void f(T&& param);
    f(expr);
    // 如果expr是个左值,则T和paramtype都会推导为左值引用
    // 如果expr是个右值,正常推导
    int x = 2;
    const int cx = x;
    const int& rx = x;
    
    f(x); // x 是左值, T的类型为int&, param 为 int&
    f(cx); cx : lvalue, T : const int&, param: const int&
    f(rx);rx : lvalue, T: const int&, param: const int&
    f(2);2: rvalue, T: int, param : int &&
    
    • ParamType既不是指针也不是引用
    template<typename T>
    void f(T param); // param 为值传递
    f(expr);
    // 因为是值传递,所以expr的所有修饰特性都会被忽略,const, 引用,volatile等,都被忽略
    
    int x = 2;
    const int cx = x;
    const int& rx = x;
    f(x); // T : int, param : int
    f(cx); // T : int, param : int
    f(rx); // T : int , param : int
    

    相关文章

      网友评论

        本文标题:C++模板型别推导规则

        本文链接:https://www.haomeiwen.com/subject/etsfkhtx.html