【模板】模板实参推断和引用

时间:2019-08-28
本文章向大家介绍【模板】模板实参推断和引用,主要包括【模板】模板实参推断和引用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  为了理解如何从函数调用进行类型推断,考虑下面的例子:

template <typename T> void f(T &p);

其中函数参数p是一个模板类型参数T的引用,非常重要的是记住两点:编译器会引用正常的引用绑定规则;const是底层的,不是顶层的。

从左值引用函数参数推断类型

  当一个函数参数是模板类型参数的一个普通(左值)引用时(即,形如T&),绑定规则告诉我们,只能传递给他一个左值(如,一个变量或一个返回引用类型的表达式)。实参可以是const,也可以不是。如果实参是const,则T将被推断为const类型。

template <typename T> void f1(T&); //实参必须是一个左值
//对f1的调用使用实参所引用的类型作为模板参数类型
f1(i);  //i是一个int;模板参数类型T是int
f1(ci); //ci是一个const int;模板参数T是const int
f1(5);  //错误:传递给一个&参数的实参必须是一个左值

  如果一个函数的参数是const T&,正常的绑定规则告诉我们可以传递给它任意类型的实参------一个对象(const或非const)、一个临时对象或一个字面常量值。当函数参数本身是const时,T的推断的结果不会是一个const类型。const已经是函数参数类型的一部分;因此,它不会是模板参数的一部分:

template <typename T> void f2(const T&); //可以接受一个右值
//f2中的参数是const &;实参中的const是无关的
//在每个调用中,f2的参数都被推断为const int&
f2(i);  //i是一个int;模板参数T是int
f2(ci); //ci是一个const int,但模板参数T是int
f2(5);  //一个const int&参数可以绑定到一个右值;T是int

从右值引用函数参数推断类型

  当一个函数参数是右值引用时(即,形如T&&),

引用折叠和右值引用参数

编写接受右值引用参数的函数模板

原文地址:https://www.cnblogs.com/bootblack/p/11423986.html