美文网首页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

相关文章

  • Effective Modern C++ 系列之 条款2: au

    Effective Modern C++ 系列之 条款2: auto 型别推导 在理解模板型别推导规则后,那么au...

  • Effective Modern C++ 系列之 条款1: 理

    Effective Modern C++ 系列之 条款1: 理解模板型别推导 1. CPP模板类型推导 函数模板一...

  • C++模板型别推导规则

    模板型别推导规则 以如下形式举例 共分三种情况: ParamType是指针或者引用但不是万能引用 ParamTyp...

  • C++型别推导1——模板推导

       自C++98开始,C++就具备了类型自动推导的能力。在11版本发布之前,C++只有一种类型推导方法,即模板类...

  • C++ auto 类型推导

    C++ auto 类型推导规则与模板类型推导[https://www.jianshu.com/p/6490ea37...

  • Item 1Understand template type d

    引子 模板类型推导是Modern C++特性auto的基础,但模板类型推导和auto类型推导有一些区别,具体看正文...

  • 模板类型推导与auto

    本文聊聊C++中的模板类型推导和auto。两者其实是一样的,前者推导T的类型,后者推导auto的类型。本文初创于公...

  • C++模板类型推导

    模板是C++的重要特性,是C++标准模板库的基础。模板可以根据数据类型自动生成代码,大大减少重复代码。模板实例化的...

  • 2.类模板与操作符重载

    项目地址 C++类模板(1) 与函数模板类似,类也可以通过参数泛化,从而可以构建出一组不同型别的类实例(对象) 类...

  • C++引用折叠规则

    引用折叠在C++模板函数中经常使用,它的规则如下: & + & -> & & + && -> & && + & -...

网友评论

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

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